2012-04-12 2 views
5

Я пытаюсь написать клон кошки осуществлять С, у меня есть этот код:Чтение из стандартного ввода записи в стандартный вывод в 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; 
} 

я попробовал 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; 
    } 

} 
+4

Не используйте 'feof' как условие цикла; он не вернет true до тех пор, пока * после * вы не попытаетесь прочитать за конец файла, поэтому ваш цикл может выполняться слишком часто. Проверьте результат 'fread' вместо этого, и если он меньше BLOCK_SIZE, * затем * вызовите' feof', чтобы проверить конец файла. И вам нужно добавить 'fflush (stdout);' после вызова 'fwrite'. –

+1

здесь fread() почти всегда возвращает нулевые байты, если вы не набрали ровно 512 символов. –

+1

@JohnBode Как выглядит мой редактор? – yasar

ответ

1

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

2

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

+0

Результатом fread() является количество прочитанных байтов, но параметры 2 и 3 определяют поведение: «1 блок размера n», в отличие от «до n блоков размера 1». В коде OPs он хочет один блок размером 512. –

+0

Да, я прочел ваш ответ так же, как и я. Я просто добавил редактирование, чтобы сделать это более понятным. Ваш ответ на другой пост может быть немного сложным для того, чтобы разыскать кого-то нового на этом языке. Я также проголосовал за ваш ответ :) – natet

1

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

Приобретите заказ размера блока и размера элемента в вызове fread. Вы хотите прочитать элементы 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.