Подтвердить что ты не робот

Представление EOF в коде C?

Символ новой строки представлен "\n" в коде C. Есть ли эквивалент для символа конца файла (EOF)?

4b9b3361

Ответ 1

EOF не является символом (в большинстве современных операционных систем). Это просто условие, которое применяется к файловому потоку, когда достигнут конец потока. Путаница возникает из-за того, что пользователь может сигнализировать EOF для ввода в консоль путем ввода специального символа (например, Control-D в Unix, Linux и др.), Но этот символ не просматривается запущенной программой, он попадает в операционную систему, которая в свою очередь, сигнализирует EOF для процесса.

Примечание: в некоторых очень старых операционных системах EOF был символом, например. Control-Z в CP/M, но это был грубый взлом, чтобы избежать накладных расходов на сохранение фактических длин файлов в каталогах файловой системы.

Ответ 2

Нет. EOF не является символом, а состоянием дескриптора файла.

Пока есть символы управления в кодировке ASCII, которая представляет конец данных, они не используются для сигнализации конца файлов в целом. Например EOT (^ D), который в некоторых случаях почти сигнализирует то же самое.

Когда стандартная библиотека C использует целое число со знаком для возврата символов и использует -1 для конца файла, это на самом деле просто сигнал, указывающий, чем произошла ошибка. У меня нет стандартного C, но процитировать SUSv3:

Если указатель конца файла для потока установлен или поток находится в конце файла, индикатор конца файла для потока должен быть установлен, а fgetc() должен возвращать EOF. Если возникает ошибка чтения, индикатор ошибки для потока должен быть установлен, fgetc() должен возвращать EOF и должен установить errno для указания ошибки.

Ответ 3

EOF не является символом. Это не может быть: A (двоичный) файл может содержать любой символ. Предположим, у вас есть файл с постоянно увеличивающимися байтами, переходящий 0 1 2 3... 255 и еще раз 0 1... 255, всего 512 байт. Какой бы ни один из этих 256 возможных байтов вы считаете EOF, файл будет прерван.

Вот почему getchar() et al. верните a int. Диапазон возможных значений возврата - это те, которые могут иметь a char, плюс истинное значение int EOF (определенное в stdio.h). То же самое, почему преобразование возвращаемого значения в char перед проверкой на EOF не будет работать.

Обратите внимание, что в некоторых протоколах есть символы "EOF". ASCII имеет "Конец текста", "Конец передачи", "Конец блока передачи" и "Конец среды". Другие ответы касались старых ОС. Я сам ввожу ^ D на Linux и ^ Z на консолях Windows, чтобы прекратить вводить программы. (Но файлы, считываемые через каналы, могут иметь символы ^ D и ^ Z в любом месте и только сигнализировать EOF, когда они заканчиваются из байтов.) Строки C заканчиваются символом '\0', но это также означает, что они не могут содержать символ '\0', Вот почему все C не строковые функции данных работают с использованием массива char (для хранения данных) и size_t (чтобы знать, где заканчиваются данные).

Изменить: стандарт C99 §7.19.1.3 гласит:

Макросы [...]
EOF
который расширяется до целочисленного постоянного выражения, с типом int и отрицательным значением, которое возвращается несколькими функциями для указать конец файла, то есть больше не вводить поток,

Ответ 4

Это зависит от системы, но часто -1. См. здесь

Ответ 5

Существует константа EOF типа int, найденная в stdio.h. Нет эквивалентного символьного символа, определенного любым стандартом.

Ответ 6

Я думаю, что это может отличаться от системы к системе, но одним из способов проверки было бы просто использовать printf

#include <stdio.h>
int main(void)
{
    printf("%d", EOF);
    return 0;
}

Я сделал это в Windows и -1 был напечатан на консоли. Надеюсь, это поможет.

Ответ 7

Символ EOF, распознаваемый командным интерпретатором в Windows (и MSDOS, и CP/M), равен 0x1a (десятичный номер 26, aka Ctrl + Z aka SUB)

Его можно по-прежнему использовать сегодня, например, для того, чтобы отметить конец читаемого человеком заголовка в двоичном файле: если файл начинается с "Some description\x1a", пользователь может сбросить содержимое файла на консоль, используя Команда TYPE и дамп останавливаются на символе EOF, т.е. Печатают некоторое описание и останавливаются, вместо продолжения с последующим мусором.

Ответ 8

Значение EOF нельзя путать с каким-либо реальным символом.

Если a= getchar(), мы должны объявить a достаточно большим, чтобы сохранить любое значение, возвращаемое getchar(). Мы не можем использовать char, так как a должен быть достаточно большим, чтобы содержать EOF в дополнение к символам.

Ответ 9

Ответ НЕТ, но...

Вы можете смутить из-за поведения fgets()

От http://www.cplusplus.com/reference/cstdio/fgets/:

Читает символы из потока и сохраняет их как строку C в str до тех пор, пока не будут прочитаны символы (num-1) или не будет достигнута ни новая строка, ни конец файла, в зависимости от того, что произойдет раньше.