Какой последний символ в файле?

Я просто прочитал ответы на «Удаление символа новой строки в конце файла», и все сказали удалить последний символ. Мой вопрос в том, не последний ли символ eof?

16 голосов | спросил sworwitz 8 +03002016-10-08T19:48:25+03:00312016bEurope/MoscowSat, 08 Oct 2016 19:48:25 +0300 2016, 19:48:25

3 ответа


11

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

  • Набор символов ASCII не содержит точного символа EOF. Существует несколько «концевых» управляющих символов: Конец текста (3), Конец передачи (4), Конец блока передачи (23), Конец среды (25). Сепаратор файлов (28) может быть ближе всего к символу EOF. Код 26 «Замените», а не EOF.

  • Ctrl - D связан только с вводом терминала. Например, команда cat filea fileb filec > outfile не включает Ctrl - D . Кстати, вы можете изменить символ EOF терминала на что-то еще, чем Ctrl - D , используя stty.

  • Строго говоря, Ctrl - D (или все, что вы изменили) не является кодом ключа EOF. Что он делает, так это вернуть системный вызов read с тем, какой ввод доступен, так же, как нажатие возврата заставляет системный вызов read возвращать строку символов вызывающему. По соглашению возвращаемое значение нуля из системного вызова чтения (т. е. чтение нулевых символов) сигнализирует о завершении состояния файла. Однако входной файл не закрывается автоматически, и, если вход поступает с терминала, он не помещается в состояние «конец файла». Вы можете написать программу, которая продолжает чтение с терминала даже после «конца файла», и вызов чтения может возвращать ненулевое значение для следующей строки ввода.

  • Аналог между символами eof и eol можно увидеть, если нажать Ctrl - D , когда какой-то ввод уже записан в строке. Например, если вы пишете «abc» и нажмите Ctrl - D , то вызов чтения возвращается, на этот раз с возвращаемым значением 3 и с «abc», сохраненным в буфер передается как аргумент. Поскольку чтение не возвращает 0, это условие не интерпретируется как условие EOF в соответствии с вышеприведенным соглашением. Аналогичным образом, нажатие на возврат приводит к возврату обращения чтения ко всей строке ввода (включая новую строку). Вы можете попробовать это с помощью команды cat: записать некоторые символы в строке и нажать Ctrl - D . Вы увидите, что символы повторены к вам, а cat ждут ввода большего количества.

  • Все вышеизложенное применяется только тогда, когда терминал находится в режиме «приготовленного», а не в «сыром» режиме, в котором минимизирована обработка ввода строк. В необработанном режиме символ Ctrl-D действительно доставляется во входной буфер.

ответил Johan Myréen 9 +03002016-10-09T10:18:55+03:00312016bEurope/MoscowSun, 09 Oct 2016 10:18:55 +0300 2016, 10:18:55
17

Управляющие символы ASCII имеют определения от 1960-х годов (фактически предшествующие тому, что вы могли бы рассмотреть сеть ). Не все эти управляющие символы используются так, как они были определены для телекоммуникационного оборудования.

В Unix-подобных системах нет необходимости в символе EOF; ни один не используется. Система может указывать приложениям, сколько байтов находится в файле:

  • В некоторых других системах (см. VMS, DOS, Windows) элемент управления-Z может выступать в качестве маркера конца файла, поскольку в версиях старше система не могла сообщить некоторым приложениям, как в файле содержится много байтов.

    В случае VMS ограничение было связано с тем, как работает среда выполнения C. Приложения на языке ассемблера могли (и сделали) получить правильный размер файла.

  • Unix-системы в оболочке обычно используют control-D, чтобы сообщить приложению, что конец ввода (файла) был достигнут, но элемент управления-D не сохраняется в файле .

В C, EOF намеренно сделан -1 , чтобы указать, что это не допустимый символ. Стандартный ввод-вывод возвращает EOF, когда условие конца файла обнаружено, а не специальный символ.

Кстати, файлы не должны заканчиваться символом newline (ASCII line-feed). Текстовые редакторы могут справиться с файлами, которые являются полностью печатаемым текстом, но не имеют завершающей новой строки.

ответил Thomas Dickey 8 +03002016-10-08T20:23:40+03:00312016bEurope/MoscowSat, 08 Oct 2016 20:23:40 +0300 2016, 20:23:40
7

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

ответил Munir 8 +03002016-10-08T20:05:03+03:00312016bEurope/MoscowSat, 08 Oct 2016 20:05:03 +0300 2016, 20:05:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132