Слияние fgetc и putchar в цикле while

Я пишу простой код для вывода содержимого файла на стандартный вывод.

Когда я использую это:

while((c=fgetc(fp))!=EOF)putchar(c);

Он работает так, как должен, но я хочу объединить putchar и fgetc. Итак, я написал

while(putchar(fgetc(fp))!=EOF);

Но, похоже, это не работает. Поэтому я проверяю возвращаемое значение putchar

RETURN VALUE
       fputc(),  putc()  and  putchar()  return  the  character  written as an
       unsigned char cast to an int or EOF on error.

Так почему это не работает?


person Chaker    schedule 20.05.2015    source источник
comment
Как вы думаете, что делает putchar(EOF)?   -  person user253751    schedule 21.05.2015
comment
Я думаю, что, возможно, это должно оцениваться как EOF   -  person Chaker    schedule 21.05.2015
comment
Но почему вы хотите записать EOF в вывод? В любом случае, EOF не unsigned char, так что это не сработает.   -  person Weather Vane    schedule 21.05.2015
comment
@ Chaker.benhamed Где сказано, что putchar ничего не напишет, если аргумент равен EOF? И почему вы думаете, что putchar вернет EOF, если ошибки не было, когда в документации сказано, что при ошибке возвращается EOF?   -  person user253751    schedule 21.05.2015
comment
Нет, я не хочу записывать EOF в вывод, но из Linux Programmer's Manual я понимаю, что putchar возвращает EOF в случае ошибки.   -  person Chaker    schedule 21.05.2015
comment
Да, но это если putchar() выйдет из строя, а не эхо того, что вы пишете. Пожалуйста, просто придерживайтесь вашего первого метода, который сработал.   -  person Weather Vane    schedule 21.05.2015
comment
Но разве putchar не должно давать сбой, поскольку EOF не является значением ASCII?   -  person Chaker    schedule 21.05.2015
comment
Его сбой является свойством выходного потока, а не того, что вы ему отправляете. Отправка EOF не сообщает об ошибке.   -  person Weather Vane    schedule 21.05.2015
comment
Ааа ОК я вижу спасибо.   -  person Chaker    schedule 21.05.2015


Ответы (1)


getchar возвращает одно из следующих значений:

  • Символ, представленный как значение unsigned char (например, обычно от 0 до 255, включая эти значения), преобразованный в int. Таким образом, обычно имеется одно из 256 (технически UCHAR_MAX+1) значений, попадающих в эту категорию.
  • Несимвол EOF, который имеет отрицательное значение, обычно -1.

Таким образом, getchar обычно может возвращать одно из 257 (не 256) значений. Если вы попытаетесь преобразовать это значение напрямую в char или unsigned char (например, вызвав putchar), вы потеряете информацию EOF.

По этой причине вам необходимо сохранить возвращаемое значение getchar в int до преобразования его в unsigned char или char.

person autistic    schedule 20.05.2015