Monday, October 11th, 2004 12:17 pm
"Как указано выше, обнаружив конец файла, функция getc() возвращает константу EOF. Однако это не самый лучший способ распознавания конца файла. Во-первых, операционная система может работать как с текстовыми, так и с бинарными файлами. Если файл открыт для бинарного ввода, из него может быть считано целое число, равное константе EOF. Следовательно, конец файла, распознаваемый функцией getc(), может не совпадать с реальным концом файла."

Я, наверное, чего-то не понимаю. Как можно считать из файла байт со значением EOF?
Про знаковое расширение у signed char я знаю, но если оно срабатывает на байтах, читаемых из файла, то это тяжелая проблема билиотеки, подлежащая срочному лечению.
Так о чём это он?
Monday, October 11th, 2004 01:26 am (UTC)
Может, о EOL?
Monday, October 11th, 2004 01:48 am (UTC)
Не, это точно про EOF - там дальше расписано про то, что во-вторых, getc() может вернуть EOF и в случае ошибки, а не только конца файла, и потому надо еще применять feof().
Monday, October 11th, 2004 01:53 am (UTC)
EOF - это такой Ctrl-Z...
:)
И он в самом деле бывает в файлах.
В текстовых - в конце. В бинарных - где угодно и сколько угодно.
Monday, October 11th, 2004 02:01 am (UTC)
О, точно. Спасибо. А я уж про CP/M и забыл давно :)

Хотя, если придираться, то это getc() может вернуть EOF, прочитав из файла ^Z.
А "считать из файла целое число, равное константе EOF" таки нельзя.
Monday, October 11th, 2004 02:03 am (UTC)
Тьфу. И ведь в книжке говорится как раз о бинарном файле, а не о текстовом. Ошибка переводчика?
Monday, October 11th, 2004 02:08 am (UTC)
The fgetc() function obtains the next byte (if present) as an unsigned char converted to an int, from the input stream pointed to by stream, and advances the associated file position indicator for the stream (if defined).

The fgetc() function may mark the st_atime field of the file associated with stream for update. The st_atime field will be marked for update by the first successful execution of fgetc(), fgets(), fgetwc(), fgetws(), fread(), fscanf(), getc(), getchar(), gets() or scanf() using stream that returns data not supplied by a prior call to ungetc() or ungetwc().

from http://www.livejournal.com/users/dil/49773.html?mode=reply

Возможно, кстати, что он о том некорректном использовании, когда пишут

char c;
c= getc();
Monday, October 11th, 2004 02:09 am (UTC)
Урло не то запостилось.

http://www.opengroup.org/onlinepubs/007908799/xsh/fgetc.html
Monday, October 11th, 2004 02:34 am (UTC)
Вау. Отвечаешь на собственные комменты - любишь поговорить с умным человеком? :)

Вообще, если читать по байту - вполне себе можно прочитать и еоф. ну, байт, целое число - какая разница :))
Monday, October 11th, 2004 02:39 am (UTC)
Там же написано сями по фоновому:

int getc(FILE *stream);

Именно int, а не char!
Соответственно, прочитать байт 0x1A (что было актуально в DOS) можно, но обрабатывать его именно как EOF никто не заставляет - точно так же, как /bin/sh завершает работу не при чтении символа ^D (0x04), а при получении SIGHUP
Monday, October 11th, 2004 03:00 am (UTC)
/bin/sh все-таки заканчивается, когда во входном файле натыкается на конец. При SIGHUP он кончается не всегда, его можно перехватить коммандой trap. Символ 0x04 -- это не EOF. EOF -- это конкретная константа, в большинстве мест -- это -1 (описание в том же stdio.h). (С другой стороны, чуть ли не единственный интерфейс, в котором импользуется константа EOF -- это getc(), а это совсем не единственный способ читать из файлов даже в stdio. Есть еще fread(), fgets(), fscanf().) Опять же, Control-D на терминале считывается как конец файла из-за драйвера терминала, а не из-за какой-то библиотечной функции.

В приведенном отрывке, конечно, написана ерунда. Не знаю уж, кто виноват, автор или переводчик.