Как ввести eof с клавиатуры

Обновлено: 21.11.2024

В этом руководстве мы расскажем, как определить EOF (конец файла) с помощью цикла while в Java. Мы также обсудим разработку программы, которая продолжает считывать содержимое до тех пор, пока не будет достигнут конец файла.

С точки зрения программирования, EOF — это специальный тип, который разработчики используют для непрерывного чтения ввода, будь то из файла или с клавиатуры. Этот процесс продолжается до тех пор, пока не закончатся данные для извлечения.

Стоит отметить, что данные в файле могут быть изменены или изменены в любой момент. Таким образом, практически невозможно применить контрольный цикл к этому файлу.

По этой причине мы настоятельно рекомендуем вам всегда использовать цикл конца файла, чтобы уменьшить потенциальную угрозу упомянутой выше проблемы.

Мы используем клавиатуру в качестве источника ввода в приведенном ниже примере кода.

Начнем с объявления и инициализации объекта класса сканера that. После этого я объявил некоторые другие переменные для использования в нашем коде.

Вы могли заметить, что мы используем console.hasNext() в качестве условия итерации цикла. Мы уже знаем, что консоль является объектом нашего сканера класса ввода.

С другой стороны, hasNext() — это предопределенный метод во входном классе Scanner. Это выражение возвращает истину только в том случае, если есть целое число на входе. В противном случае возвращается false.

Скомпилируйте этот код самостоятельно и посмотрите на результат. Из вывода совершенно очевидно, что наша программа продолжает считывать данные до тех пор, пока мы не укажем неверный тип ввода. В этом случае эта программа выдает исключение несоответствия ввода.

Файл как источник ввода

В другом примере мы используем цикл while, управляемый концом файла, для непрерывного чтения данных из файла.

Допустим, мы хотим прочитать все данные из файла Student\_Result.txt. Файл содержит имена учащихся, за которыми следуют их результаты тестов.

Наша цель в этой программе — вывести файл, в котором отображаются имена учащихся, результаты тестов и оценки.

Скомпилируйте и запустите эту программу в своей системе, чтобы посмотреть, что произойдет.

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».

сообщить об этом объявлении

Что нужно ввести в стандартный ввод на терминале, чтобы создать EOF?

@user1593308, Вы пробовали нажимать CTRL-D? пл. проверьте, переносит ли это код в другую часть.

4 ответа 4

В Windows сочетание клавиш Control+Z обычно используется для обозначения "конца файла", в Linux и Unix обычно используется сочетание клавиш Control+D .

@user1593308 Просто выполните printf("EOF=%d\n", EOF); , не нужно получать значение из getchar() , просто используйте макрос напрямую.

  1. EOF заключен в макрос по определенной причине — вам никогда не нужно знать значение.
  2. Из командной строки, когда вы запускаете свою программу, вы можете отправить EOF в программу с помощью Ctrl-D (Unix) или CTRL-Z (Microsoft).

Чтобы определить значение EOF на вашей платформе, вы всегда можете просто распечатать его:

@KMC - позвольте мне уточнить. Делаем так: printf("%i\n", 'K'); в конце концов напечатает «75», а не «К». Я также сомневаюсь, что печать EOF как символа с «%c» приведет к печати «CTRL+D». В зависимости от терминала вы можете даже получить «?». Имейте в виду, что EOF — это то, что библиотека возвращает, когда вы читаете ввод, и в любом случае он не может быть представлен как печатный символ. Когда вы записываете вывод в своем терминале, нажатие CTRL+D (или чего-либо еще) приводит к тому, что терминал завершает ввод; это не заставляет терминал генерировать конкретное представление EOF. Надеюсь, это прояснит ситуацию.

Вы можете имитировать EOF с помощью:

До сих пор это не упоминалось ни в одном из других ответов, но вам может потребоваться нажать правильную комбинацию клавиш (^D или ^Z) 2 или 3 раза, чтобы фактически подать сигнал EOF; см. здесь объяснение.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегом c или задайте свой вопрос.

Связано

Связанные

Горячие вопросы о сети

Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.22.41737

Этот вопрос был закрыт, поскольку речь не шла об официальной версии Ubuntu. В настоящее время ответы не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Ask Ubuntu.

Закрыт 6 лет назад.

Это мой исходный код C.

Когда я создаю его в Ubuntu, он начинает получать символы, но я не знаю, как завершить программу, так как она не завершается вводом ENTER или возврата каретки.

Что означает EOF? Как я могу активировать его?

Этот источник также находится в книге Денниса Ритчи:

3 ответа 3

Как правило, вы можете "активировать EOF" в программе, запущенной в терминале, нажатием клавиши CTRL + D сразу после последнего сброса ввода.

Что означает EOF? Как я могу запустить его?

EOF означает конец файла.

"Запуск EOF" в данном случае примерно означает "уведомление программы о том, что больше никаких входных данных отправляться не будет".

В этом случае, поскольку getchar() вернет отрицательное число, если ни один символ не будет прочитан, выполнение будет прекращено.

Но это относится не только к вашей конкретной программе, но и ко многим другим инструментам.

Как правило, «запуск EOF» можно выполнить с помощью сочетания клавиш CTRL + D сразу после последнего сброса ввода (т. е. путем отправки пустого ввода).

Например, с кошкой:

Что происходит под капотом при нажатии CTRL + D, так это то, что ввод, введенный с момента последнего сброса ввода, сбрасывается; когда это оказывается пустым вводом, системный вызов read(), вызванный на STDIN программы, возвращает 0 , getchar() возвращает отрицательное число ( -1 в библиотеке GNU C), и это, в свою очередь, интерпретируется как EOF 1 .

Компиляция работает, потому что запятая не привязана к одной строке. Кроме этого, отличное объяснение EOF :)

iirc EOF не определяется как -1 согласно стандарту. Это просто то, что происходит, например, в glibc.

EOF не «заключается в отправке «пустого ввода»», и ответ SO, который вы цитируете, не говорит об обратном. Это внеполосный сигнал. В случае терминала он отправляется нажатием Ctrl/d.

TL;DR: EOF — это не символ, это макрос, используемый для оценки отрицательного результата функции чтения ввода. Можно использовать Ctrl + D для отправки символа EOT, который заставит функцию вернуть -1

Каждый программист должен использовать RTFM

Давайте обратимся к «Справочному руководству по CA» Харбисона и Стила, 4-е изд. с 1995 г., стр. 317:

Отрицательное целое число EOF — это значение, которое не является кодировкой "реального символа" . . . Например, fget (раздел 15.6) возвращает EOF в конце файла, потому что нет «настоящего символа» для чтения.

По сути, EOF — это не символ, а целочисленное значение, реализованное в stdio.h для представления -1 . Таким образом, ответ kos верен, но речь не идет о получении «пустого» ввода. Важным примечанием является то, что здесь EOF служит для сравнения возвращаемого значения (из getchar() ), а не для обозначения фактического символа. Человек getchar поддерживает это:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

fgetc(), getc() и getchar() возвращают символ, прочитанный как unsigned char, приведенный к типу int или EOF в конце файла или при ошибке.

gets() и fgets() возвращают s в случае успеха и NULL в случае ошибки или когда происходит конец файла, а символы не были прочитаны.

ungetc() возвращает c в случае успеха или EOF при ошибке.

Возьмем цикл while. Его основная цель — повторить действие, если условие в скобках истинно. Посмотрите еще раз:

В основном это говорит о том, что продолжайте делать что-то, если c = getchar() возвращает успешный код ( 0 или выше; кстати, это обычное дело, попробуйте запустить успешную команду, затем echo $? вернуть ). Итак, если мы успешно получаем символ и присваиваем значение C, возвращаемый код состояния равен 0, ошибка равна -1. EOF определяется как -1 . Поэтому, когда возникает условие -1 == -1, цикл останавливается. И когда это произойдет? Когда больше нет символов для получения, когда c = getchar() терпит неудачу. Вы можете написать while ((c = getchar ()) != -1) и это все равно будет работать

Кроме того, вернемся к фактическому коду, вот выдержка из stdio.h

Коды ASCII и EOT

Хотя символ EOF не является фактическим символом, существует символ EOT (конец передачи), который имеет десятичное значение ASCII, равное 04; он связан с сочетанием клавиш Ctrl + D (представлен также как метасимвол ^D). Символ окончания передачи использовался для обозначения закрытия потока данных еще тогда, когда компьютеры использовались для управления телефонными соединениями, отсюда и название «конец передачи».

Поэтому можно отправить это значение ascii в программу следующим образом, обратите внимание на $'\04', который является EOT:

Таким образом, мы можем сказать, что он существует, но его нельзя распечатать

Примечание

Мы часто забываем, что в прошлом компьютеры не были такими универсальными — дизайнерам приходилось использовать все доступные клавиши клавиатуры.Таким образом, отправка символа EOT с помощью CtrlD по-прежнему является «отправкой символа», в отличие от ввода заглавной буквы A, ShiftA, вы по-прежнему даете компьютеру ввод с доступными клавишами. Таким образом, EOT является реальным символом в том смысле, что он исходит от пользователя, он может быть прочитан компьютером (хотя и не может быть распечатан, невидим для людей), он существует в памяти компьютера

Комментарий Byte Commander

Если вы попытаетесь прочитать из /dev/null, это также должно вернуть EOF, верно? Или что я там получу?

Да, совершенно верно, потому что в /dev/null нет фактического символа для чтения, поэтому c = getchar() вернет код -1, и программа сразу же завершит работу. Команда снова не возвращает EOF. EOF — это просто постоянная переменная, равная -1, которую мы используем для сравнения кода возврата функции getchar. EOF не существует как символ, это просто статическое значение внутри stdio.h .

Еще один гвоздь в крышку гроба

Иногда пытаются доказать, что EOF — это символ с таким кодом:

Проблема в том, что тип данных char может быть значением со знаком или без знака. Кроме того, они имеют наименьший адресуемый тип данных, что делает их очень полезными в микроконтроллерах, где память ограничена. Поэтому вместо объявления int foo = 25; в микроконтроллерах с небольшой памятью часто встречается char foo = 25; или что-то подобное. Кроме того, символы могут быть подписаны или не подписаны.

Можно проверить размер в байтах с помощью такой программы:

В чем суть? Дело в том, что EOF определяется как -1, но тип данных char может печатать целые значения.

Хорошо. . .так что, если мы попытаемся напечатать char как строку?

Очевидно, ошибка, но тем не менее ошибка расскажет нам кое-что интересное:

skolodya@ubuntu:$ gcc EOF.c -o EOF
EOF.c: В функции 'main': EOF.c:4:5: предупреждение: формат '%s' ожидает аргумент тип 'char *', но аргумент 2 имеет тип 'int' [-Wformat=] printf("%s", EOF);

Шестнадцатеричные значения

Печать EOF в виде шестнадцатеричного значения дает FFFFFFFF , 16-битное (8-байтовое) значение, дополненное двумя числами к -1 .

Еще одна любопытная вещь происходит со следующим кодом:

Если нажать Shift + A , мы получим шестнадцатеричное значение 41 , очевидно, такое же, как и в таблице ASCII. Но для Ctrl + D у нас снова есть ffffffff — возвращаемое значение getchar(), хранящееся в c.

Ссылка на другие языки

Обратите внимание, что другие языки избегают этой путаницы, поскольку они оперируют оценкой состояния выхода функции, а не сравнением его с макросом. Как читать файл в Java?

В Windows сочетание клавиш Control+Z – обычное сочетание клавиш, означающее "конец файла", в Linux и Unix – обычно Control+D . EOF заключен в макрос не просто так — вам никогда не нужно знать значение.

Как вы вводите EOF в Python?

read(size=-1, /) метод _io. Экземпляр TextIOWrapper Чтение не более n символов из потока. Читать из базового буфера, пока у нас не будет n символов или мы не нажмем EOF. Если n отрицательное или опущено, читать до EOF.

Как мне попасть в EOF?

Если вы печатаете на терминале и хотите спровоцировать конец файла, используйте CTRL-D (системы в стиле Unix) или CTRL-Z (Windows). Затем, после того как все входные данные будут прочитаны, getchar() вернет EOF и, следовательно, getchar() !=

Что возвращает Fscanf в EOF?

fscanf возвращает EOF, если конец файла (или ошибка ввода) происходит до сохранения каких-либо значений. Если значения сохранены, возвращается количество сохраненных элементов; то есть количество раз, когда значение присваивается одному из указателей аргументов fscanf. EOF возвращается, если ошибка возникает до сопоставления каких-либо элементов.

Что такое EOF в Shell?

Оператор EOF используется во многих языках программирования. Этот оператор обозначает конец файла. Обычно он используется либо для печати текста файла в терминале, либо для копирования содержимого файла в другое указанное место.

Как читать пользовательский ввод до конца файла?

Если аргумент размера отрицательный или опущен, считывать все данные до тех пор, пока не будет достигнут EOF. Кстати, не используйте input в качестве имени переменной. Он затеняет ввод встроенной функции. В Python 3 вы можете перебирать строки стандартного ввода, цикл останавливается при достижении EOF: помните, что бы вы ни вводили, это строка.

Как работает функция EOF в Unix?

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

Как активировать EOF в конце файла?

fgetc(), getc() и getchar() возвращают символ, прочитанный как unsigned char, приведенный к типу int или EOF в конце файла или при ошибке. gets() и fgets() возвращают s в случае успеха и NULL в случае ошибки или когда происходит конец файла, а символы не были прочитаны.

Читайте также: