В соответствии с стандартом C любые символы, возвращаемые fgetc
, возвращаются в виде значений unsigned char
, "преобразованных в int
" ( эта цитата исходит из стандарта C, заявляя, что действительно есть преобразование).
Когда sizeof (int) == 1
, многие значения unsigned char
находятся за пределами диапазона. Таким образом, возможно, что некоторые из этих значений unsigned char
могут быть преобразованы в значение int
(результат преобразования ", определяемый реализацией или определяемый реализацией сигнал поднят" ) EOF
, который будет возвращен, несмотря на то, что файл фактически не находится в ошибочном состоянии или состоянии конца файла.
Я с удивлением обнаружил, что такая реализация действительно существует. Документ UCHAR_MAX
TMS320C55x > CCS имеет соответствующее значение 65535, INT_MAX
, имеющее 32767, fputs
и fopen
, поддерживающий двоичный режим... Что даже более удивительно то, что он, кажется, описывает окружающую среду как полностью соответствующую, полную реализацию (минус-сигналы).
Компилятор C55x C/С++ полностью соответствует стандарту ISO C, который определяется спецификацией ISO...
Инструменты компилятора поставляются с полной библиотекой времени выполнения. Все библиотеки функции соответствуют стандарту библиотеки ISO C....
Является ли такая реализация, которая может возвращать значение, указывающее ошибки там, где их нет, действительно полностью соответствует? Может ли это оправдываться использованием feof
и ferror
в разделе условий цикла (как это кажется отвратительным)? Например, while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }