Lire depuis l'entrée standard stdin écrire sur la sortie standard en C

Je suis en train d'écrire un chat clone pour l'exercice C, j'ai ce 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;
}

J'ai essayé echo "1..2..3.." | ./cat et ./cat < garbage.txt mais je ne vois pas de sortie sur la borne. Ce que je fais de mal ici?

Edit:
Selon les commentaires et les réponses, j'ai fini par faire ceci:

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

}
N'utilisez pas de feof en tant que votre condition de boucle; il ne reviendra pas vrai jusqu'à ce que après vous avez tenté de lire au-delà de la fin du fichier, de sorte que votre boucle peut exécuter une fois de trop. Vérifier le résultat de fread au lieu de cela, et si elle est plus petite que TAILLE_BLOC, appel feof de vérifier pour la fin-de-fichier. Et vous avez besoin d'ajouter fflush(stdout); après la fwrite appel.
ici, fread (), presque toujours, les résultats de zéro octets, sauf si vous avez tapé exactement de 512 caractères.
Comment modifier mon look?
Mieux, bien que probablement, vous voulez vérifier le nombre d'octets renvoyés avant écrit à stdout. Vous pouvez inverser le sens de l'épreuve, comme if (bytes > 0) fwrite(...) else break;; après tout, si vous obtenez 0 octets en arrière, vous pourriez aussi bien avoir frappé les expressions du FOLKLORE.

OriginalL'auteur yasar | 2012-04-12