что выводит fgetc в особом случае, когда int width == CHAR_BIT - PullRequest
1 голос
/ 15 ноября 2011

В разделе 7.19.7.1 C99 имеем:

Если индикатор конца файла для входного потока, на который указывает поток, не установлен и следующий символ присутствует, функция fgetc получает этот символ как неподписанный char преобразуется в int и перемещает соответствующий индикатор положения файла для поток (если определен).

Как я понял, тип int может иметь такую ​​же ширину, что и unsigned char. В таком случае, можем ли мы заключить, что fgetc будет функционировать правильно, только если int width> CHAR_BIT.

(со ссылкой на комментарий blagovest), указывает ли C99, когда следует ожидать стандартную библиотеку, или может ли соответствующая реализация реализовать часть, но не всю стандартную библиотеку?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

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(), фактически указывающий либо конец файла, либо ошибку - но стандарт этого не гарантирует.

0 голосов
/ 15 ноября 2011

Да, на такой платформе было бы одно значение unsigned char, которое нельзя было бы отличить от EOF.

unsigned char не допускается иметь байты заполнения, поэтому набор значений для unsigned char будет расширенным набором возможных значений для int.

. Единственная надежда на такую ​​платформу, которая может быть получена, заключается в том, что хотя бы char будет подписано, поэтому EOF не будетконфликт с положительными значениями char.

Вероятно, это не единственная проблема, с которой столкнулась бы такая платформа.

...