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 derfread
statt, und wenn es kleiner ist als BLOCK_SIZE, dann rufen Siefeof
zu prüfen, für die Ende-der-Datei. Und man muss hinzufügenfflush(stdout);
nach derfwrite
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, wieif (bytes > 0) fwrite(...) else break;
; nach allem, wenn Sie 0 Byte zurück, Sie könnte genauso gut haben hit EOF.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ich kann zitieren eine Antwort von mir: https://stackoverflow.com/a/296018/27800
Dein problem scheint zu sein, den Rückgabewert von fread. Ich veränderte den code drucken Sie die bytes Wert, und ich bekomme 0 jedes mal. Die man-Seite für fread macht deutlich, dass der Rückgabewert von fread ist NICHT die Anzahl der Zeichen. Wenn EOF gefunden wird der return-Wert kann null sein (das ist es in diesem Fall). Dies ist, weil Sie versuchen, zum Lesen in 1 Sache, die Größe BLOCK_SIZE eher als BLOCK_SIZE Dinge, die sind Größe 1.
Versuchen Sie anrufen
fflush(stdout)
nach derfwrite()
Ignorieren Sie meinen Kommentar über
fflush
; das ist nicht das Problem.Tauschen Sie die Reihenfolge der block-Größe und das element Größe in der
fread
nennen. Sie wollen Lesen, bis zu BLOCK_SIZE Elementen der Größe 1 (sizeof (char)
1 per definition); was Sie tun, ist zu versuchen, zu Lesen 1-element von der Größe BLOCK_SIZE, so es sei denn, Sie geben in mindestens BLOCK_SIZE Zeichenfread
0 zurück. IOW, Ihrefread
Aufruf werden mussMachen eine ähnliche änderung der
fwrite
nennen.