Мы можем записать символ EOF сами?

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

filestream.close

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

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

Заранее спасибо.

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

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

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

39
задан Trevor Hickey 15 December 2016 в 19:57
поделиться

5 ответов

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

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

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

52
ответ дан 27 November 2019 в 02:14
поделиться

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

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

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

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

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

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

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

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

14
ответ дан 27 November 2019 в 02:14
поделиться

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

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

7
ответ дан 27 November 2019 в 02:14
поделиться

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

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

но для этого нет веских причин. В этом также нет необходимости:

 filesystem.close();

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

4
ответ дан 27 November 2019 в 02:14
поделиться

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

2
ответ дан 27 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

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