Я только что прочитал ответы на «Удаление символа новой строки в конце файла», и все сказали, чтобы удалить последний символ. Мой вопрос, разве не последний персонаж?
Я только что прочитал ответы на «Удаление символа новой строки в конце файла», и все сказали, чтобы удалить последний символ. Мой вопрос, разве не последний персонаж?
Ответы:
Файл не заканчивается символом конца файла, так как предыдущие ответы правильно указывают. Но я думаю, что ответы и комментарии содержат некоторые неточности, на которые стоит обратить внимание:
Набор символов ASCII не содержит точного символа EOF. Существует несколько управляющих символов «конец»: Конец текста (3), Конец передачи (4), Конец передачи блока (23), Конец среды (25). File Separator (28), возможно, ближе всего подходит к символу EOF. Код 26 - «Заменитель», а не EOF.
Ctrl- Dсвязан только с терминальным входом. Например, команда
cat filea fileb filec > outfileне включает Ctrl- D. Кстати, вы можете изменить символ терминала EOF на что-то другое Ctrl- Dиспользуя sttyкоманду.
Строго говоря, Ctrl- D(или что бы вы ни изменили) не является кодом ключа EOF. То, что он делает, это заставляет readсистемный вызов возвращаться с тем, какой ввод доступен, так же, как нажатие return заставляет системный вызов read возвращать строку символов вызывающей стороне. По соглашению, возвращаемое значение нуля из системного вызова read (то есть чтение нулевых символов) сигнализирует об окончании состояния файла. Однако входной файл не закрывается автоматически, и, если ввод поступает с терминала, он не переводится в состояние «конец файла». Вы можете написать программу, которая продолжает чтение с терминала даже после «конца файла», и вызов read может возвращать ненулевое значение для следующей строки ввода.
Аналогию между символами eof и eol можно увидеть, если Ctrl- Dнажата, когда какой-либо ввод уже записан в строке. Например, если вы пишете «abc» и нажимаете Ctrl- Dвызов read возвращается, на этот раз с возвращаемым значением 3 и с «abc», хранящимся в буфере, передаваемом в качестве аргумента. Поскольку read не возвращает 0, это не интерпретируется как условие EOF согласно соглашению выше. Точно так же нажатие кнопки возврата к возвращает вызов чтения со всей строкой ввода (включая перевод строки). Вы можете попробовать это с помощью catкоманды: напишите несколько символов в строке и нажмите Ctrl- D. Вы увидите, что персонажи возвращаются к вам и catожидают большего ввода.
Все вышеперечисленное применяется только тогда, когда терминал находится в «готовом» режиме, в отличие от «необработанного» режима, в котором обработка ввода строки минимизирована. В необработанном режиме символ Ctrl-D действительно доставляется во входной буфер.
Управляющие символы ASCII имеют определения 1960-х годов (фактически предшествующие тому, что вы могли бы считать сетью ). Не все эти управляющие символы используются так, как они были определены для телекоммуникационного оборудования в то время.
В Unix-подобных системах нет необходимости в EOFперсонаже; ни один не используется. Система может сообщить приложениям, сколько байтов находится в файле:
В некоторых других системах (видимых в VMS, DOS, Windows) control-Z может действовать как маркер конца файла, потому что в более старых версиях система не могла сообщить некоторым приложениям, сколько байтов в файле.
В случае VMS ограничение было связано с тем, как работала среда выполнения C. Приложения на языке ассемблера могли (и делали) получить правильный размер файла.
Системы Unix в оболочке обычно используют control-D, чтобы сообщить приложению, что достигнут конец ввода (файла), но control-D не сохраняется в файле.
В C EOFспециально сделано, -1чтобы указать, что это недопустимый символ. Стандартный ввод / вывод возвращается EOFпри обнаружении условия конца файла, а не специального символа.
Кстати, файлы не должны заканчиваться символом перевода строки (ASCII-перевод строки). Текстовые редакторы могут работать с файлами, которые представляют собой печатный текст, но не содержат завершающей строки.
busybox's vi, и т. д.).
EOF не персонаж. Это состояние, которое указывает, что больше нет символов для чтения из файлового потока. Когда вы вводите команду EOF из терминала, вы даете сигнал ОС закрыть входной поток, не вводя специальный символ.
bashполучить в свои руки вход, он массируется драйвером TTY. Этот драйвер перехватывает Ctrl-D и отправляет EOF bash (где EOF не символ, а особый статус файла)