Чтение из stdin записи в stdout в C

Я пытаюсь написать клоун cat для упражнения C, у меня есть этот код:

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

Я попробовал echo "1..2..3.." | ./cat echo "1..2..3.." | ./cat и ./cat < garbage.txt но я не вижу никакого вывода на терминале. Что я здесь делаю неправильно?

Изменить: Согласно комментариям и ответам, я закончил это:

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

я могу процитировать ответ от меня: https://stackoverflow.com/a/296018/27800

 fread(buffer, sizeof(char), block_size, stdin); 

Ваша проблема кажется возвращаемым значением fread. Я изменил ваш код, чтобы распечатать значение байтов, и каждый раз получаю 0. Страница man for fread дает понять, что возвращаемое значение fread НЕ является числом символов. Если встречается EOF, возвращаемое значение может быть нулевым (что в этом случае). Это происходит из-за того, что вы пытаетесь прочитать в 1 вещь размером BLOCK_SIZE, а не BLOCK_SIZE, которая имеет размер 1.

Попробуйте вызвать fflush(stdout) после fwrite()

Игнорировать мой комментарий о fflush ; это не проблема.

Поменяйте порядок размера блока и размер элемента в переадресации. Вы хотите прочитать элементы BLOCK_SIZE размером 1 ( sizeof (char) – 1 по определению); то, что вы делаете, пытается прочитать 1 элемент размера BLOCK_SIZE, поэтому, если вы не наберете хотя бы символы BLOCK_SIZE, fread вернет 0. IOW, ваш fread вызов должен быть

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

Сделайте аналогичное изменение для вызова fwrite .