Linux eof что это

🐧 Что такое EOF (End Of File)? Примеры с PHP, C ++, C, Python, Java

Что такое End Of File?

End Of File – это специальные данные или разделитель, которые устанавливают конец для конкретного файла.

Этот файл содержит различные типы данных от текста до изображения, но End Of File одинаков для всех.

End Of File – также может быть выражен как EOF в краткой форме.

EOF также используется на разных языках программирования для выражения и проверки End Of File .

Проверка End Of File важна, особенно при разработке приложений.

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

End Of File в C и C ++

C и C ++ предоставляют разные функции работы с файлами.

Мы можем использовать значение EOF для проверки End Of File , который можно использовать для проверки возвращаемого значения различных функций.

EOF хранит -1, где функция файловой операции возвратит -1, когда достигнут конец файла.

В следующем примере мы будем читать файл с именем myfile.txt с помощью функции getc (), которая будет каждый раз читать один символ из заданного файла.

Мы будем проверять EOF после каждой операции чтения.

End Of File в PHP

PHP предоставляет функцию feof () для проверки End Of File .

Если есть несколько байтов или нет конца файла, функция feof () вернет false, и предоставленная итерация будет продолжаться до конца файла.

Источник

Что такое EOF и как его вызвать?

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

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

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

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

3 ответа

Tl; др

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

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

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

«Запуск EOF» в этом случае примерно означает «информирование программы о том, что ввод больше не будет отправлен».

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

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

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

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

Читайте также:  Windows free vpn server

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

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

Давайте обратимся к «Справочному руководству C A» Harbison and Steele, 4-е изд. с 1995 г., стр. 317:

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

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

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

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

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

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

Это в основном говорит продолжать делать вещи, если c = getchar() возвращает успешный код ( 0 или выше; кстати, это обычное дело, попробуйте запустить успешную команду, затем echo $? а потом не удалось 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 ,

Читайте также:  Installing linux from usb flash

Еще один гвоздь в гробу

Иногда пытаются доказать, что 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: warning: format ‘%s’ ожидает аргумент типа ‘char *’, но аргумент 2 имеет тип ‘int’ [-Wformat=] printf(«%s», EOF);

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

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

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

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

Обратитесь к другим языкам

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

Источник

Операторы перенаправления вывода в Bash: что означает &1 и другие

Рассмотрим операторы перенаправления вывода Bash и похожие по функции операторы и конструкции. Я собрал следующий список, если что-то пропустил, то пишите в комментариях:

Этот оператор на английском называется pipe, и на русском его называют труба или конвейер. Используется очень часто для перенаправления вывода из одной команды в другую, которая может принимать стандартный вывод. Например:

Символ > используется для перенаправления вывода в файл, например:

В этом примере вывод команды ls -l будет записан в файл dir.txt.

То есть оператор | используется когда вывод передаётся в другую команду, а оператор > используется когда вывод записывается в файл.

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

Результат работы этой последовательности команд будет сохранён в файл num.txt.

Если файл не существует, то он будет создан. Если файл существует, то оператор > полностью удалит его содержимое и запишет новым.

> /dev/null

Это частный случай перенаправления, когда всё из стандартного вывода перенаправляется в псевдоустройство /dev/null. Это означает уничтожение данные. То есть ничего не будет выводиться в стандартный вывод.

Функция оператора >> похожа на > с тем отличием, что оператор >> не удаляет содержимое файла, а дописывает новые данные к уже существующим.

Если файл не существует, то оператор >> создаст его и запишет в него переданные данные.

Оператор 2> перенаправляет стандартный вывод ошибок — standard error (stderr).

Результат выполнения команд и возникшие ошибки выводятся на консоль и может показаться, что это одно и то же. Но на самом деле, это разные типы вывода.

К примеру попытаемся сохранить в файл текст ошибки, возникшей в результате выполнения команды:

Читайте также:  Facebook mobile app windows phone

Текст ошибки будет выведен на экран, но файл ls-error.txt окажется пустым.

Дело в том, что нужно различать стандартный вывод и стандартный вывод ошибок. Чтобы перенаправить стандартный вывод в файл используется оператор 2>:

В данном случае ошибка не будет выведена на экран, а будет сохранена в файл ls-error.txt.

Чтобы перенаправить стандартную ошибку, мы должны обратиться к её файловому дескриптору. Программа может выводить любой из нескольких пронумерованных файловых потоков. Первые три из этих файловых потоков называются стандартный ввод, стандартный вывод и стандартный вывод ошибок. Оболочка ссылается на них внутренне как файловые дескрипторы 0, 1 и 2 соответственно. Оболочка обеспечивает запись для перенаправления файлов с использованием номера дескриптора файла. Поскольку стандартная ошибка совпадает с дескриптором файла номер 2, мы можем перенаправить стандартную ошибку с помощью 2>.

Файловый дескриптор «2» помещается непосредственно перед оператором перенаправления, чтобы выполнить перенаправление стандартной ошибки в файл ls-error.txt.

Конструкция 2>&1 предназначена для перенаправления стандартного вывода и стандартного вывода ошибок в один файл.

В некоторых случаях мы можем захотеть записать весь вывод команды в один файл. Чтобы сделать это, мы должны одновременно перенаправить как стандартный вывод, так и стандартный вывод ошибок. Есть два способа сделать это. Во-первых, традиционный способ, который работает со старыми версиями оболочки:

Используя этот метод, мы выполняем два перенаправления. Сначала мы перенаправляем стандартный вывод в файл ls-output.txt, а затем перенаправляем дескриптор файла 2 (стандартная вывод ошибок) на дескриптор файла один (стандартный вывод), используя обозначения 2>&1.

Обратите внимание, что порядок перенаправлений является значимым. Перенаправление стандартной ошибки всегда должно происходить после перенаправления стандартного вывода, иначе оно не работает. В приведённом выше примере

перенаправляет стандартную ошибку в файл ls-output.txt, но при изменении порядка на

стандартная ошибка направлена на экран.

Последние версии bash предоставляют второй, более упрощённый метод для выполнения комбинированного перенаправления 2>&1:

В этом примере мы используем одинарную запись &> для перенаправления как стандартного вывода, так и стандартной ошибки в файл ls-output.txt.

Вы также можете добавить стандартные выходные данные и стандартные потоки ошибок в один файл, например так:

Итак, &> является аналогом 2>&1, а &>> это то же самое, но с перенаправлением вывода в файл.

Это ещё одна форма «подстановки процессов» (Process Substitution):

Если используется эта форма, то вместо записи в файл, данные будут переданы на ввод для КОМАНДЫ.

>(КОМАНДА) > /dev/null

Эка комбинация, включающая в себя 3 уже рассмотренных элемента:

  • 2> означает перенаправление стандартного вывода ошибок (stderr)
  • >(КОМАНДА) означает подстановку процессов, в результате стандартный вывод ошибок будет передан для обработки в КОМАНДУ
  • > /dev/null означает перенаправления стандартного вывода в /dev/null, то есть фактическое уничтожение стандартного вывода

Пример практического использования:

HTTP заголовки команда cURL выводит в stderr, а команда grep не ищет по stderr. Но если мы хотим искать только по HTTP заголовков (игнорируя HTML код), то мы не может сделать просто перенаправление stderr для слияния со стандартным выводом, то есть не можем 2>&1, поскольку текст страницы может содержать фразу «401 Unauthorized» и мы получим ложное срабатывание. Поэтому мы используем указанную выше конструкцию — стандартный вывод ошибок обрабатывается, стандартный вывод уничтожается.

cat > ФАЙЛ (перенаправление вывода в файл)
  • > ФАЙЛ > (перенаправление вывода в файл с дописыванием данных)
  • ФАЙЛ
  • Данная конструкция получает многострочный ввод по стандартному вводу и сохраняет его в файл. То есть это аналог

    в котором просто операторы поменяны местами.

    Источник

    Оцените статью