File eof что это c
EOF — это не символ
Если вы читали о системе ввода-вывода Unix/Linux, или экспериментировали с ней, если писали программы на C, которые читают данные из файлов, то это заявление вам, вероятно, покажется совершенно очевидным. Но давайте поближе присмотримся к следующим двум утверждениям, относящимся к тому, что я нашёл в книге:
EOF — это не символ
Это может выглядеть так:
А что такое, вообще, символ? Символ — это самый маленький компонент текста. «A», «a», «B», «b» — всё это — разные символы. У символа есть числовой код, который в стандарте Unicode называют кодовой точкой. Например — латинская буква «A» имеет, в десятичном представлении, код 65. Это можно быстро проверить, воспользовавшись командной строкой интерпретатора Python:
Или можно взглянуть на таблицу ASCII в Unix/Linux:
Скомпилируем и запустим программу:
В конце файлов нет некоего особого символа
Может, EOF — это особенный символ, который можно обнаружить в конце файла? Полагаю, сейчас вы уже знаете ответ. Но давайте тщательно проверим наше предположение.
Возьмём простой текстовый файл, helloworld.txt, и выведем его содержимое в шестнадцатеричном представлении. Для этого можно воспользоваться командой xxd :
Что такое EOF?
EOF (end-of-file) — это состояние, которое может быть обнаружено приложением в ситуации, когда операция чтения файла доходит до его конца.
ANSI C
Начнём с почтенного C. Представленная здесь программа является модифицированной версией cat из книги «Язык программирования C».
Вот некоторые пояснения, касающиеся вышеприведённого кода:
Python 3
Запустим программу и взглянём на возвращаемые ей результаты:
Вот более короткая версия этого же примера, написанная на Python 3.8+. Здесь используется оператор := (его называют «оператор walrus» или «моржовый оператор»):
В Go можно явным образом проверить ошибку, возвращённую Read(), на предмет того, не указывает ли она на то, что мы добрались до конца файла:
JavaScript (Node.js)
Низкоуровневые системные механизмы
Вот эта программа, написанная на C:
Вот та же программа, написанная на Python 3:
Вот — то же самое, написанное на Python 3.8+:
Запустим и этот код:
Итоги
End of File (EOF) in C
I am currently reading the book C Programming Language by Ritchie & Kernighan. And I am pretty confused about the usage of EOF in the getchar() function.
Then I tried to run the example on the book that can count the number of characters using the code below but it seems that I never get out of the loop even if I press enter so I am wondering when would I reach the EOF?
Then, I read the same problem at Problem with EOF in C. Most people advised that instead of using EOF, use the terminator \n or the null terminator ‘\0’ which makes a lot of sense.
Does it mean that the example on the book serves another purpose?
3 Answers 3
EOF indicates «end of file». A newline (which is what happens when you press enter) isn’t the end of a file, it’s the end of a line, so a newline doesn’t terminate this loop.
The code isn’t wrong[*], it just doesn’t do what you seem to expect. It reads to the end of the input, but you seem to want to read only to the end of a line.
[*] well, it has undefined behavior if the input is more than LONG_MAX characters due to integer overflow, but we can probably forgive that in a simple example.
The call to getchar() returns EOF when you reach the «end of file». As far as C is concerned, the ‘standard input’ (the data you are giving to your program by typing in the command window) is just like a file. Of course, you can always type more, so you need an explicit way to say «I’m done». On Windows systems, this is control-Z. On Unix systems, this is control-D.
The example in the book is not «wrong». It depends on what you actually want to do. Reading until EOF means that you read everything, until the user says «I’m done», and then you can’t read any more. Reading until ‘\n’ means that you read a line of input. Reading until ‘\0’ is a bad idea if you expect the user to type the input, because it is either hard or impossible to produce this byte with a keyboard at the command prompt 🙂
Что такое EOF на языке программирования C?
и если вы введете Ctrl-D, вы ничего не увидите.
9 ответов
вы должны изменить скобки на
вы получаете два 1 в качестве вывода, потому что вы делаете сравнение «c!=ВФ.» Это всегда будет один для символа, который вы ввели, а затем «\n», который следует, нажав return. За исключением последнего сравнения, где c действительно является EOF, он будет ставлю 0.
EOF, который расширяется до целого числа постоянное выражение, с типом int и отрицательное значение, возвращаемое несколько функций для указания конец файла, то есть, больше нет ввода из ручья;
символ ^D-это то, что вы вводите в поток консоли в UNIX/Linux, чтобы сказать ему логически завершить входной поток. Но в других контекстах (например, когда вы читаете из файла) это просто еще один символ данных. Так или иначе, ^Д символ (то есть конец ввода) никогда не попадает в код приложения.
как говорит @ Bastien, EOF также возвращается, если getchar() не удается. Строго говоря, вы должны позвонить ferror или feof чтобы увидеть, представляет ли EOF ошибку или конец потока. Но в большинстве случаев ваша заявка будет делать то же самое в любом случае.
EOF означает конец файла. Это знак того, что конец файла достигнут, и что данных больше не будет.
Edit:
Я исправлюсь. В данном случае это не конец файла. Как уже упоминалось, он передается при передаче CTRL+d (linux) или CTRL+z (windows).
также getchar () обрабатывает ключ возврата как допустимый вход, поэтому вам также нужно буферизировать его.EOF-маркер для указания конца ввода. Как правило, это int со всеми битами.
обратная совместимость с CP / M. файловая система CP/M записала только длины файлов в кратных 128-байтовых «записях», поэтому условно символ Control-Z использовался для обозначения конца значимых данных, если он заканчивался в середине записи. Файловая система MS-DOS всегда записывала точную длину байта файлов, поэтому в MS-DOS это никогда не было необходимо.
Это позволяет программам использовать один и тот же код для чтения ввода с терминала и текстовый файл.
Я думаю, что это правильный способ проверить значение EOF. И я проверил выход.
для ввода: abc и Enter я получил вывод: 97 98 99 10. ( ASCII значения)
попробуйте другие входы вместо Ctrl-D, например Ctrl-Z. Я думаю, что он варьируется от компилятора к компилятору.
изменен приведенный выше код, чтобы дать больше ясности на EOF, нажмите Ctrl+d и putchar используется для печати char избегайте использования printf в цикле while.
Что такое EOF и как его вызвать?
Это мой C исходный код.
Когда я собираю его в Ubuntu, он начинает получать символы, но я не знаю, как завершить программу, так как он не заканчивается вводом ENTER или возврата каретки.
Что означает EOF? Как я могу вызвать это?
Этот источник также есть в книге Денниса Ритчи:
3 ответа
Tl; др
Как правило, вы можете «запустить EOF» в программе, работающей в терминале с помощью нажатия клавиш CTRL + D сразу после последнего сброса ввода.
Что означает EOF? Как я могу вызвать это?
EOF означает конец файла.
«Запуск EOF» в этом случае примерно означает «информирование программы о том, что ввод больше не будет отправлен».
В этом случае, так как getchar() вернет отрицательное число, если ни один символ не прочитан, выполнение прекращается.
Но это относится не только к вашей конкретной программе, это относится ко многим различным инструментам.
В общем, «запуск EOF» может быть выполнен нажатием комбинации клавиш CTRL + D сразу после последнего сброса ввода (т. Е. Путем отправки пустого ввода).
Каждый программист должен RTFM
Давайте обратимся к «Справочному руководству C A» Harbison and Steele, 4-е изд. с 1995 г., стр. 317:
fgetc(), getc() и getchar() возвращают символ, прочитанный как символ без знака, приведенный к типу int или EOF в конце файла или ошибки.
get () и fgets() возвращают s в случае успеха и NULL в случае ошибки или когда происходит конец файла, когда символы не были прочитаны.
ungetc () возвращает c в случае успеха или EOF в случае ошибки.
Кроме того, давайте вернемся к фактическому коду, вот выдержка из stdio.h
Коды ASCII и EOT
Таким образом, мы можем сказать, что он существует, но это не для печати
Примечание
Комментарий Byte Commander
Если вы попытаетесь прочитать из /dev/null, это также должно вернуть EOF, верно? Или что я получу там?
Еще один гвоздь в гробу
Проблема в том, что тип данных char может иметь значение со знаком или без знака. Кроме того, они являются наименьшим адресуемым типом данных, что делает их очень полезными в микроконтроллерах, где память ограничена. Так что вместо того, чтобы объявить int foo = 25; это часто встречается в микроконтроллерах с небольшой памятью char foo = 25; или что-то подобное. Кроме того, символы могут быть подписаны или не подписаны.
Можно проверить, что размер в байтах с программой, как это:
ХОРОШО. то, что если мы попытаемся напечатать char как строку?
Очевидно, ошибка, но, тем не менее, ошибка скажет нам кое-что интересное:
Шестнадцатеричные значения
Еще одна любопытная вещь происходит со следующим кодом:
Обратитесь к другим языкам
Обратите внимание, что другие языки избегают этой путаницы, потому что они работают с оценкой состояния выхода из функции, а не сравнивают ее с макросом. Как читать файл в Java?
File eof что это c
EOF (аббревиатура англ. end of file — конец файла) в компьютерной терминологии является индикатором операционной системы означающим, что данные в источнике закончились. Источниками данных обычно являются файлы и потоки.
В стандартной библиотеке Си функции ввода/вывода, в частности доступа к файлам, могут возвращать значение, равное символьной константе (точнее макроопределению) EOF для индикации, что достигнут конец файла. Реальное значение EOF является отрицательным числом, зависящим от системы (в основном −1), что гарантирует несовпадение с кодом символа.
Макрос определён в stdio.h.
Для указания терминалу в UNIX «EOF» следует воспользоваться комбинацией клавиш Ctrl+D. В Windows — Ctrl+Z.
Ссылки
Полезное
Смотреть что такое «EOF» в других словарях:
EOF — Saltar a navegación, búsqueda EOF (abreviatura de end of file, fin de fichero en inglés) es un indicador o marca de que no hay más información que recuperar de una fuente de datos. La fuente de datos puede ser un fichero o un flujo de datos… … Wikipedia Español
EOF — may refer to:* End of file, the computing term for the end of file character or signal * Empirical orthogonal functions, a statistical technique for simplifying a dataset * Enterprise Objects Framework, a product from Apple Computer * End of… … Wikipedia
EOF — [Abk. für End of File, dt. Dateiende], Dateiendezeichen … Universal-Lexikon
EOF — (End Of File) special character which signifies the end of a file (Computers) … English contemporary dictionary
Eof — For the computing term, see end of file. Eof (also Eoves) was a swineherd who claimed to have seen a vision of the Virgin Mary at Evesham in England, about 701. [CathEncy|id=05648a|title=Evesham Abbey] Eof related this vision to Egwin, Bishop of… … Wikipedia
EOF — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Sigles d’une seule lettre Sigles de deux lettres > Sigles de trois lettres Sigles de quatre lettres … Wikipédia en Français
Eof — Pour les articles homonymes, voir EOF. Eof, ou Eoves, est un gardien de troupeau qui affirme avoir eu une apparition mariale à Evesham, en Angleterre, aux environs de 701. Il raconta cette vision à Egwin, évêque de Worcester, qui fonda l abbaye d … Wikipédia en Français
EOF — Die Abkürzung EOF steht für: End of File, das Ende einer Datei im Computersprachgebrauch Enterprise Objects Framework von Apple Computer Elektroosmotischer Fluss in der Elektrophorese Empirische Orthogonalfunktion Diese S … Deutsch Wikipedia
EOF — Computers. end of file: a code, marker, or signal used to indicate the end of a file of data. * * * EOF UK US computing end of file Thesaurus: abbreviations used in computing and on the internethyponym … Useful english dictionary
EOF — Computers. end of file: a code, marker, or signal used to indicate the end of a file of data. * * * … Universalium