2012-04-12 7 views
5

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

} 
+4

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'. –

+1

qui fread() genera quasi sempre zero byte a meno che non abbiate digitato esattamente 5 caratteri. –

+1

@JohnBode Come appare la mia modifica? – yasar

risposta

1

Provare a richiamare fflush(stdout) dopo la fwrite()

2

Il problema sembra essere il valore di ritorno di fread. Ho modificato il codice per stampare i byte valore e ottengo 0 ogni volta. La pagina man di fread chiarisce che il valore di ritorno di fread NON è il numero di caratteri. Se si incontra EOF, il valore restituito potrebbe essere zero (che è in questo caso). Questo perché stai tentando di leggere in 1 cosa che è la dimensione BLOCK_SIZE anziché BLOCK_SIZE le cose che sono la dimensione 1.

+0

il risultato di fread() è il numero di byte letti, ma i parametri 2 e 3 specificano il comportamento: "1 blocco di dimensione n", rispetto a "fino a n blocchi di dimensione 1". Nel codice OPs vuole un blocco di dimensioni 512. –

+0

Sì, ho letto la tua risposta proprio mentre stavo pubblicando la mia. Ho appena aggiunto una modifica per renderla più chiara. La tua risposta sull'altro post potrebbe essere un po 'difficile da analizzare per qualcuno di nuovo nella lingua. Ho anche votato per la tua risposta :) – natet

1

Ignora il mio commento su fflush; non è questo il problema

Scambiare l'ordine delle dimensioni del blocco e la dimensione dell'elemento nella chiamata fread. Vuoi leggere fino a BLOCK_SIZE elementi di dimensione 1 (sizeof (char) è 1 per definizione); quello che stai facendo sta cercando di leggere 1 elemento di dimensioni BLOCK_SIZE, quindi a meno che si digita almeno caratteri BLOCK_SIZE, fread tornerà 0. IOW, la chiamata fread ha bisogno di essere

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

Fai un simile passare alla chiamata fwrite.