Символ новой строки представлен "\n"
в коде C. Есть ли эквивалент для символа конца файла (EOF)?
Представление EOF в коде C?
Ответ 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) или не будет достигнута ни новая строка, ни конец файла, в зависимости от того, что произойдет раньше.