Несмотря на свое имя, getc
возвращает int
, а не char
, так что он может представлять все возможные значения символов и, кроме того, EOF
(конец файла). Если бы getc
вернул char
, невозможно было бы указать конец файла без использования одного из значений, которые могли бы быть в файле.
Итак, чтобы исправить свой код, вы должны сначала изменить объявление char c;
на int c;
, чтобы оно могло содержать маркер EOF при его возврате. Затем вы должны также изменить условие цикла while, чтобы проверить EOF
вместо NULL
.
Вы также можете вызвать feof(fr)
, чтобы проверить конец файла отдельно от чтения символа. Если бы вы сделали это, вы могли бы оставить c
как char
, но вам нужно было бы позвонить feof()
после того, как вы прочитали символ, но до того, как распечатали его, и использовать break
, чтобы выйти из цикла. .