Lesen von stdin, schreiben auf stdout in C

Bin ich zu schreiben versucht, eine Katze Klon zu übung C, ich habe diesen code:

#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;
}

Versuchte ich echo "1..2..3.." | ./cat und ./cat < garbage.txt aber ich sehe keine Ausgabe auf terminal. Was mache ich hier falsch?

Bearbeiten:
Laut Kommentare und Antworten, landete ich 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;
    }

}
  • Verwenden Sie nicht feof wie Ihr loop-Zustand; es wird nicht true zurückgegeben, nachdem Sie versucht haben, Lesen Sie über das Ende der Datei, so dass Sie Ihre Schleife ausführen dürfen und einmal zu oft. Überprüfen Sie das Ergebnis der fread statt, und wenn es kleiner ist als BLOCK_SIZE, dann rufen Sie feof zu prüfen, für die Ende-der-Datei. Und man muss hinzufügen fflush(stdout); nach der fwrite nennen.
  • hier fread (), führt beinahe immer null-bytes, es sei denn, Sie eingegeben haben, in genau 512 chars.
  • Wie wirkt sich meine änderung Aussehen?
  • Besser, obwohl Sie wahrscheinlich wollen, um zu überprüfen, die Anzahl der bytes zurückgegeben wird, bevor das schreiben zu stdout. Sie könnte umkehren den Sinn des Tests, wie if (bytes > 0) fwrite(...) else break;; nach allem, wenn Sie 0 Byte zurück, Sie könnte genauso gut haben hit EOF.
InformationsquelleAutor yasar | 2012-04-12
Schreibe einen Kommentar