Sto cercando di scrivere un clone di gatto di esercitare C, ho questo codice:leggere da scrittura stdin stdout in 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;
}
ho provato echo "1..2..3.." | ./cat
e ./cat < garbage.txt
ma non vedo alcun output sul terminale . Cosa sto facendo di sbagliato qui?
Edit: Secondo le osservazioni e le risposte, ho finito per fare questo:
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;
}
}
Non utilizzare 'feof' come condizione del ciclo; non restituirà true finché * dopo * hai tentato di leggere oltre la fine del file, quindi il ciclo potrebbe essere eseguito una volta troppo spesso. Controlla invece il risultato di 'fread', e se è più piccolo di BLOCK_SIZE, * quindi * chiama' feof' per verificare la fine del file. E devi aggiungere 'fflush (stdout);' dopo la chiamata 'fwrite'. –
qui fread() genera quasi sempre zero byte a meno che non abbiate digitato esattamente 5 caratteri. –
@JohnBode Come appare la mia modifica? – yasar