Ребята, давайте не путать ТС. EOF в C - константа всегда равная -1.
(В соседнем форуме кто-то недавно сослался на этот старинный тред и был введен в заблуждение тем, что он тут прочитал)
Во-первых, нет,
EOF в стандартной библиотеке - отрицательное значение, константа типа
int. Оно может быть равно какому угодно отрицательному значению типа
int. Разумеется, первым приходящим в голову вариантом является именно
-1 , по каковой причине в реализациях вы как правило увидите именно его. Однако ни С, ни POSIX не гарантируют такого значения. Можно найти примеры экзотических реализацией с
-2.
Во-вторых, на уровне исходного кода это просто не имеет значения. Вас не должно интересовать, чему равно
EOF, ибо проверку на
EOF вы все равно будет делать всегда в рамках именно типа
int и либо прямым сравнением с именованной константой
EOF, либо проверкой на отрицательность. То есть конкретное числовое значение вас интересовать не будет вообще. А за попытки проверки на конец файла через явное сравнение с
-1, как и за попытки пихать это значение в
signed char (ибо "-1 обязательно поместится") вы получите сочного пендаля и по параболической траектории улетите подметать улицы, без права когда либо еще быть подпущенным к С-коду (я несколько утрирую, но лишь для того, чтобы лучше донести суть).
В-третьих, где действительно может иметь значение конкретное значение
EOF - это в вопросах
бинарной совместимости модулей. Но это уже совсем другая тема.
-- 02.11.2021, 22:41 --EOF как символ (например, Ctrl-D) имеет смысл при чтении данных из источника, в котором нет «естественного» конца. Например, с клавиатуры. Как определить, что ввод с клавиатуры закончен? Может, пользователь просто задумался? Так что нужен какой-то сигнал «Конец ввода».
Комбинация Ctrl-D в POSIX системах сама по себе не имеет никакого отношения к
EOF и не является символом
EOF.
Комбинация Ctrl-D - это все лишь команда терминала, которая заставляет терминал протолкнуть накопленный на этот момент буфер ввода во входной поток ожидающего этого ввода процесса. Ожидающий ввода процесс ожидает завершения функции
read() на входном потоке. Комбинация Ctrl-D всего лишь вызывает досрочное завершение функции
read(). Функция
read() при этом возвращает количество байтов, которое она успела прочитать до момента нажатия Ctrl-D. В этом и заключается вся суть комбинации Ctrl-D - вызвать досрочное завершение функции
read(). Больше ничего. Ни о каком
EOF комбинация Ctrl-D не знает и никакого отношения к
EOF не имеет.
Однако в POSIX действует соглашение, согласно которому, если функция
read() вернула 0 (то есть ей не удалось прочитать ни одного байта), то это означает достижение конца файла. По этой причине вы можете косвенно использовать комбинацию Ctrl-D для искусственного создания ситуации
EOF: когда процесс начал ожидать ввода через
read(), вам нужно ничего не вводя сразу нажать Ctrl-D. Функция
read() сразу завершится и вернет 0, что будет расценено, как конец файла.
По этой причине, когда терминал работает в режиме построчной буферизации, комбинация Ctrl-D расценивается как
EOF только если вы нажмете ее в самом начале строки. Если вы нажмете Ctrl-D, когда в строке что-то уже набрано, никакого
EOF не получится. Набранный буфер будет просто передан ждущему приложению, функция
read() вернет положительное значение и всё.