2012-04-12 13 views
5

Ich versuche, eine Katze Klon zu schreiben C zu trainieren, ich habe diesen Code:von stdin Schreib Lesen in stdout C

#include <stdio.h> 
#define BLOCK_SIZE 512 
int main(int argc, const char *argv[]) 
{ 
    if (argc == 1) { // copy stdin to stdout 
     char buffer[BLOCK_SIZE]; 
     while(!feof(stdin)) { 
      size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin); 
      fwrite(buffer, bytes, sizeof(char),stdout); 
     } 
    } 
    else printf("Not implemented.\n"); 
    return 0; 
} 

Ich versuchte echo "1..2..3.." | ./cat und ./cat < garbage.txt aber ich sehe keinen Ausgang an der Klemme . Was mache ich hier falsch?

Edit: Laut Kommentare und Antworten, landete ich dies bis zu tun:

void copy_stdin2stdout() 
{ 
    char buffer[BLOCK_SIZE]; 
    for(;;) { 
     size_t bytes = fread(buffer, sizeof(char),BLOCK_SIZE,stdin); 
     fwrite(buffer, sizeof(char), bytes, stdout); 
     fflush(stdout); 
     if (bytes < BLOCK_SIZE) 
      if (feof(stdin)) 
       break; 
    } 

} 
+4

Verwenden Sie 'feof' nicht als Schleifenbedingung; es wird erst nach * nach * wahr zurückgegeben, nachdem Sie versucht haben, über das Ende der Datei hinaus zu lesen, sodass Ihre Schleife möglicherweise zu oft ausgeführt wird. Überprüfen Sie stattdessen das Ergebnis von "fread", und wenn es kleiner als BLOCK_SIZE ist, * dann rufen Sie 'feof' auf, um nach dem Dateiende zu suchen. Nach dem 'fwrite'-Aufruf müssen Sie' fflush (stdout); 'hinzufügen. –

+1

Hier ergibt fread() fast immer null Bytes, wenn Sie nicht exakt 512 Zeichen eingegeben haben. –

+1

@JohnBode Wie sieht meine Bearbeitung aus? – yasar

Antwort

1

Versuchen fflush(stdout) nach dem fwrite()

2

Ihr Problem scheint der Rückgabewert von fread zu sein. Ich habe Ihren Code geändert, um die Wert-Bytes auszudrucken, und ich bekomme jedes Mal 0. Die Manpage für fread macht deutlich, dass der Rückgabewert von fread NICHT die Anzahl der Zeichen ist. Wenn EOF auftritt, könnte der Rückgabewert Null sein (was in diesem Fall der Fall ist). Das liegt daran, dass Sie versuchen, 1 Ding der Größe BLOCK_SIZE einzulesen, anstatt BLOCK_SIZE Dinge der Größe 1.

+0

Das Ergebnis von fread() ist die Anzahl der gelesenen Bytes, aber Parameter 2 und 3 geben das Verhalten an: "1 Block der Größe n", versus "bis zu n Blöcke der Größe 1". Im OP-Code will er einen Block der Größe 512. –

+0

Ja, ich habe deine Antwort gelesen, als ich gerade meine gepostet habe. Ich habe gerade einen Schnitt hinzugefügt, um das deutlicher zu machen. Ihre Antwort auf den anderen Beitrag ist vielleicht etwas schwierig für jemanden, der neu in der Sprache ist. Ich habe auch für deine Antwort gestimmt :) – natet

1

Ignorieren Sie meinen Kommentar über fflush; Das ist nicht das Problem.

Vertauschen Sie die Reihenfolge der Blockgröße und der Elementgröße im fread Aufruf. Sie möchten BLOCK_SIZE-Elemente der Größe 1 lesen (sizeof (char) ist 1 per Definition); was Sie tun versucht, ein Element der Größe BLOCK_SIZE zu lesen, so dass, wenn Sie in mindestens BLOCK_SIZE Zeichen eingeben, fread 0. IOW zurückkehren wird, muss Ihr fread Anruf

size_t bytes = fread(buffer, 1, sizeof buffer, stdin); 

Machen Sie eine ähnlich sein Wechseln Sie zum fwrite Anruf.