Подтвердить что ты не робот

Можем ли мы написать персонаж EOF?

Большинство языков, таких как С++ при записи в файл, помещают символ EOF, даже если нам не хватает записи таких операторов, как:

filestream.close

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

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

Спасибо заранее.

EDIT: Спасибо за вашу поддержку, но здесь добавление к этому вопросу:

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

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

4b9b3361

Ответ 1

Нет символа EOF. EOF по определению "не соответствует любому допустимому коду символов". Часто это -1. Он не записывается в файл в любой момент.

В DOS есть историческое значение символа EOF (CTRL + Z), но в наши дни оно устарело.

Чтобы ответить на следующий вопрос об Apoorv:. OS никогда не использует данные файла для определения длины файла (файлы не "завершаются нулем" ). Таким образом, вы не можете обмануть ОС. Возможно, старые, глупые программы не будут читаться после символа CTRL + Z. Я бы не стал предполагать, что любое приложение Windows (даже "Блокнот" ) сделает это. Я предполагаю, что было бы проще обмануть их с помощью символа null (\0).

Ответ 2

Ну, EOF - это просто значение, возвращаемое функцией, определенной в заголовочном файле C stdio.h. Фактически он вернулся ко всем функциям чтения ОС, поэтому его системная зависимость. Когда OS достигает конца файла, он отправляет его функции, которая в своем возвратном значении, чем места чаще всего (-1), но не всегда. Итак, чтобы суммировать, EOF не является символом, а константой, возвращаемой ОС. EDIT: Ну, вам нужно больше узнать о файловой системе, посмотрите this.

Привет, на ваш второй вопрос:

вы должны лучше выглядеть в filesystems. FAT - очень хороший пример, потому что вы можете найти много статей об этом, и его принципы очень похожи на NTFS. В любом случае, EOF снова NOT a character. Вы не можете поместить его в файл напрямую. Если бы вы могли это сделать, представьте, что последствия, даже "немой" файл изображения не могут быть прочитаны системой.

Почему? Becouse OS работает как очень сложная структура слоев. Одним из уровней является драйвер файловой системы. Он гарантирует, что он передает данные из каждой файловой системы, известной водителю. Он обеспечивает мост между приложениями и исполнительную систему хранения файлов на HDD.

Чтобы быть точным, файловая система FAT использует так называемую таблицу FAT - это таблица, расположенная близко к началу адресного пространства жесткого диска (или раздела), и содержит карту всех кластеров (небольшие ячейки памяти). Итак, теперь, когда вы хотите сохранить файл на жесткий диск, ОС (драйвер файловой системы) просматривает таблицу FAT и ищет значение "0x0" . Это значение "0x0" указывает ОС, что кластер, адрес которого описывается местоположением этого значения в таблице FAT, можно свободно писать.

Таким образом, он записывает в него первую часть файла. Затем он ищет другое значение "0x0" в FAT, и если он найден, он записывает вторую часть файла в кластер, на который указывает. Затем он изменяет значение первой записи таблицы FAT, где файл находится на физическом адресе следующего в нашем случае второй части файла.

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

Итак, теперь вы видите, что если вы хотите вручную записать значение EOF в место, к которому оно не принадлежит, вам нужно написать свой собственный драйвер, который сможет переписать запись FAT, но это практически невозможно для начинающих.

Ответ 3

Я приехал сюда, выполняя упражнения Кернигана и Ричи C.

Ctrl + D отправляет символ, который соответствует константе EOF из stdio.h.

(Edit: это в Mac OS X, благодаря @markmnl, указав, что эквивалент Windows 10 Ctrl + Z)

Ответ 4

На самом деле в С++ нет физического символа EOF, записанного в файл с использованием механизмов fprintf() или ostream. EOF - это условие ввода-вывода, указывающее, что больше нет данных для чтения.

Некоторые ранние дисковые операционные системы, такие как CP/M, фактически использовали физический 0x1A (символ ASCII SUB) для указания EOF, поскольку файловая система поддерживала только размер файла в блоках, чтобы вы точно не знали, сколько времени файл был в байтах. С появлением сохранения фактических отсчетов длины в каталоге больше не характерно хранить символ "EOF" как часть данных внутриполосного файла.

Ответ 5

В Windows, если вы столкнулись с ASCII 26 (EOF) в stdin, он перестанет читать остальную часть данных. Я считаю, что запись этого символа также завершит вывод, отправленный в stdout, но я этого не подтвердил. Вы можете переключить поток в двоичный режим как в этом вопросе SO:

#include <io.h>
#include <fcntl.h>
...
_setmode(0, _O_BINARY)

И вы не только остановите 0x0A, преобразованный в 0x0D 0x0A, но и получите возможность читать и писать 0x1A. Обратите внимание, что вам, возможно, придется переключать как stdin (0), так и stdout (1).

Ответ 6

Если по символу EOF вы имеете в виду что-то вроде Control-Z, то современным операционным системам не нужна такая вещь, а среда выполнения С++ не будет писать ее для вас. Вы можете, конечно, написать один:

 filestream.put( 26 );     // write Ctrl-Z

но для этого нет веских оснований. Также не нужно делать:

 filesystem.close();

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

Ответ 7

Нет такой вещи, как символ "EOF". Факт закрытия потока сам по себе является условием "EOF".

Когда вы нажимаете Ctrl + D в оболочке unix, это просто закрывает стандартный поток ввода, который, в свою очередь, распознается оболочкой как "EOF" и завершается.

Итак, чтобы "отправить" EOF, просто закройте поток, которому необходимо отправить "EOF".

Ответ 8

Никто еще не упомянул системные вызовы [f]truncate, которые, как вы делаете файл короче, не воссоздавая его с нуля.

Функции truncate() и ftruncate() приводят к тому, что обычный файл с именем path или ссылкой fd будет усечен до размера точно length байтов.

Если файл ранее был больше этого размера, дополнительные данные теряются. Если файл ранее был короче, он расширен, а расширенная часть читается как нулевые байты ('\0').

Поймите, что это отличная операция от записи каких-либо данных в файл. Файл представляет собой линейный массив байтов, как-то выложенный на диске, с метаданными, в которых говорится, сколько времени это происходит; truncate изменяет метаданные.

Ответ 9

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

Ответ 10

Да, вы можете вручную добавить EOF в файл. 1) в Mac terminan создайте новый файл. touch filename.txt

2) Откройте файл в VI

vi filename.txt

3) В режиме вставки (нажмите i) введите Control + V, а затем Control + D. Не отпускайте клавишу управления на Mac.

В качестве альтернативы, если мне нужны другие ^ NewLetter, такие как ^ N ^ M ^ O ^ P и т.д., Я мог бы выполнить Contorl + V, а затем Control + NewLetter. Так, например, чтобы сделать ^ O, удерживайте нажатой клавишу Control, а затем введите V и O, затем отпустите Control.