2016-05-29 3 views
-1

Meine Aufgabe zu übergeben ist ein C-Programm zu schreiben, das mv-Befehl System zu veranschaulichen Anrufe:Wie Daten in eine Datei von stdin in der Shell

#include<stdio.h> 
#include<errno.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/types.h> 
#include<fcntl.h> 
#define BUF_SIZE 8192 
int main(){ 
int input_fd,output_fd; 
ssize_t ret_in, ret_out; //number of bytes returned by read(), write() 
char buffer[BUF_SIZE]; 
output_fd=open("sss", O_WRONLY | O_CREAT); 
if(output_fd==-1){ 
     perror("open"); 
     return 3; 
} 
while((ret_in=read(stdin, buffer, BUF_SIZE))>0){ 
     ret_out=write (output_fd, buffer,(ssize_t) ret_in); 
     if(ret_out!=ret_in){ 
       perror("write"); 
       return 4; 
     } 
} 
close(output_fd); 
input_fd=open("sss", O_RDONLY); 
while((ret_in=read(input_fd,buffer, BUF_SIZE))>0) 
     ret_out=write(stdout, buffer,(ssize_t) ret_in); 
close(input_fd); 
return 0; 
} 

Wie dieser Code in der Schale laufen und es passiert Text von stdin? Bitte, gib mir exapmle Daten in eine Datei von stdin in der Schale stdout-1 (oder STDOUT_FILENO) und stdin-0 (oder STDIN_FILENO) der Weitergabe

+0

Der Code weist Probleme auf, die zu unerwartetem Verhalten führen würden. Ist es die vollständige Quelle? –

+0

ja, aber ich nahm es aus dem Buch und es kann absichtlich Fehler – Stranger

+0

Opening eine Datei zum Schreiben 'O_CREAT' enthalten funktioniert nicht immer, wenn Sie keine Berechtigungen haben, zum Beispiel wird es fehlschlagen,' open() 'würde return '-1' und dann können Sie' errno' überprüfen, um zu überprüfen, warum. Der Code tut das nicht. Was genau erwartest du auch? Die Frage erklärt nicht, was das erwartete Verhalten ist. –

Antwort

1

Befestigen Sie zuerst Ihren Code und ändern. Die anderen sind FILE * und gehören zu fread und fwrite. Jeder vernünftige Compiler sollte Sie dort gewarnt haben ...

./MoveCommand < filename ist eine Möglichkeit.

Dadurch wird der Inhalt von filename zu stdin umgeleitet und es wird in die Datei "sss" geschrieben, nach der diese Datei gelesen und der Inhalt auf stdout echotiert wird.

Sie tun also cat filename im Wesentlichen, mit einer zusätzlichen Kopie in eine bestimmte Datei.

./Movecommand an sich ist auch möglich. Aber dann musst du die Eingabe selbst eingeben (das ist stdin an diesem Punkt) und wenn du signalisieren willst, dass du fertig bist, Strg + D (Linux oder Mac) oder Strg + Z (Windows). Dann wird alles, was Sie zurückgeschrieben haben, wieder aufgenommen, und der Inhalt befindet sich ebenfalls in "sss".

Sie können es natürlich auch in einem Rohr verwenden, also ls -l | ./Movecommand z. Versuch es.

+0

Ich habe ./MoveCommand text.txt ausprobiert. Das Ergebnis ist, dass Datei sss erstellt wird, aber die Größe von es ist Null. Der Inhalt von text.txt ist jedoch nicht leer. Auch ich habe ./Movecommand selbst versucht, aber dann, wenn ich die Eingabe beendet habe und tippen Sie auf Enter, es wird gesagt, dass ein solcher Befehl nicht existiert. – Stranger

+0

@Stranger Sie brauchen <, "weniger als", text.txt, sagen, aus text.txt zu lesen –

+0

@Stranger ./Movecommand selbst sollte nur hängen, oder? Geben Sie Text ein (Eingabe macht nichts besonderes) und beenden Sie mit Strg + D. –

Verwandte Themen