fgetc
возвращает EOF
в конце файла или в состоянии ошибки.
В противном случае возвращается прочитанный символ в виде unsigned char
, преобразованный в int
.
Предположим, CHAR_BIT == 16
и sizeof (int) == 1
, и предположим, что следующий прочитанный символ имеет значение 0xFFFF.Тогда fgetc()
вернет 0xFFFF, преобразованный в int
.
Здесь это становится немного сложнее.Поскольку 0xFFFF не может быть представлен типом int
, результат преобразования определяется реализацией.Но обычно результат будет -1, что является типичным значением (фактически единственным значением, о котором я когда-либо слышал) для EOF
.
Так что в такой системе fgetc()
можетвернуть EOF
, даже если он успешно читает символ.
Здесь нет противоречия.Стандарт гласит, что fgetc()
возвращает EOF
в конце файла или при ошибке.Это не говорит обратное;возврат EOF
не обязательно не означает, что произошла ошибка или условие конца файла.
Вы все еще можете определить, прочитал ли fgetc()
действительный символ или нет, вызвавfeof()
и ferror()
.
Таким образом, такая система разорвет типичную входную петлю:
while ((c = fgetc()) != EOF) {
...
}
, но она не будет (обязательно) не соответствовать стандарту.
(со ссылкой на комментарий blagovest), указывает ли C99, когда следует ожидать стандартную библиотеку, или может ли соответствующая реализация реализовать часть, но не всю стандартную библиотеку?
«Размещенная реализация» должна поддерживать всю стандартную библиотеку, включая <stdio.h>
.
«Отдельная реализация» не должна поддерживать <stdio.h>
;только стандартные заголовки, которые не объявляют никаких функций (<limits.h>
, <stddef.h>
и т. д.).Но автономная реализация может предоставить <stdio.h>
, если она выберет.
Обычно автономные реализации предназначены для встроенных систем, часто без операционной системы.
На практике каждую текущую размещенную реализацию я знаюиз имеет CHAR_BIT==8
.Подразумевается, что на практике вы можете , вероятно, рассчитывать на EOF
результат из fgetc()
, фактически указывающий либо конец файла, либо ошибку - но стандарт этого не гарантирует.