Мне всегда удавалось читать и писать базовые текстовые файлы на C++, но до сих пор никто не обсуждал ничего большего, чем это.
У меня такой вопрос:
Если я сам разрабатываю тип файла для использования в приложении, которое я также создаю, как мне записать данные в файл и сохранить макет, форматирование и т. д.? Есть ли какие-то стандарты или это зависит только от творчества программиста?





Если вы создаете двоичный файл, вы можете записать в него любой файл. Единственный недостаток в том, что вы должны точно знать, где он начинается и где заканчивается.
Обычно для этих целей вы используете стороннюю библиотеку. Например, вы могли бы связать библиотеку базы данных, скажем, Oracle, которая позволит вам общаться с базой данных. Поскольку базовый тип файла (например, электронная таблица Excel против Openoffice, Oracle против MySQL и т. д.) Отличается, эти библиотеки отвлекают вас от необходимости заботиться о том, как создается файл.
Надеюсь, это поможет вам найти то, что вы ищете!
Конечно, существует ряд стандартов. Скорее всего, стоит использовать некоторую разновидность xml, поскольку уже существуют библиотеки и инструменты, которые помогут вам с ним работать, но ничто не мешает вам изобрести свои собственные.
По сути, вам нужно придумать собственный формат файла и записать двоичные данные. Вы также можете сериализовать свою объектную модель и записать результат в файл, но это обычно менее эффективно.
Лучше использовать существующую базу данных или использовать xml (или другой) для простых нужд. Если вы хотите записать файл в уже существующем формате, найдите библиотеку, которая его поддерживает.
Что ж, вы можете хранить данные в формате, который вы можете читать, но который поддерживает целостность ваших данных (например, XML или JSON).
Или (содрогаться) вы можете придумать свой собственный проприетарный двоичный формат и использовать его.
вы бы поступили так же, как и с текстовым файлом. запись ваших данных побайтно, закодированных таким образом, что, читая файл, вы знаете, что читаете. для приложения для работы с электронными таблицами вы даже можете использовать текстовый формат (OOXML, OpenDocument) для хранения информации о презентации и содержании.
Или вы можете определить двоичные структуры данных и записать их непосредственно в файл.
выбор между текстовым или двоичным форматом зависит от приложения. для файла конфигурации вы можете предпочесть текстовый файл, который можно изменить вне вашего приложения, для базы данных вы, скорее всего, выберете двоичный формат из соображений производительности.
Вы должны знать формат двоичного файла для файла, который вы пытаетесь создать. Рассмотрим Сообщение Джоэла по этой теме: формат файла 97-2003 - это спецификация на 349 страниц.
Почти все время, чтобы сделать что-то подобное, вы используете API, чтобы избежать ворчания. Однако будьте осторожны, потому что метод проб и ошибок и выяснение того, «что работает» методом проб и ошибок, может привести к обновлению программы и нарушению вашего кода. Кроме того, вы должны учитывать другие операционные системы, незначительные различия в версиях, исправления и т. д.
См. wotsit.org для информации о форматах файлов для различных типов файлов. Пример: вы можете точно выяснить, как записать файл .BMP и как он составлен.
Запись в базу данных может выполняться с помощью класса-оболочки на вашем языке, в основном передавая ему команды SQL.
Используйте xml (что-то открытое, описательное и проверяемое) и придерживайтесь текста. Для подобных вещей тоже есть стандарты, в том числе ODF
Вы можете открыть файл как двоичный, а не текстовый (как это сделать, в некоторой степени зависит от платформы), оттуда вы можете записывать данные непосредственно на диск. Единственное реальное предостережение - порядок байтов, который может стать проблемой при перемещении файлов из одной архитектуры в другую (например, с x86 на PPC).
Записать двоичные данные на диск на самом деле не сложнее, чем написать текст, и действительно, ваше творчество является ключом к тому, как вы храните данные.
Общая проблема обычно называется сериализацией состояния вашего приложения и в вашем случае с источником / целью файла в любом формате, который вам подходит. В наши дни предпочтительным форматом ввода / вывода является XML, и вы можете изучить существующие стандарты в этой области. Тогда проблема заключается в том, как мне сопоставить состояние моей системы с конкретной схемой. Boost имеет структуру сериализации, которую вы, возможно, захотите проверить.
/ Аллан
Вы можете использовать множество подходов, но в целом вам понадобится какая-то библиотека сериализации. BOOST :: Serialization или Буферы протоколов Google являются хорошим примером этого. Основная идея состоит в том, что у вас есть структуры памяти (классы и объекты), которые представляют ваши данные, и вы хотите записать эти данные в файл таким образом, чтобы их можно было использовать для повторного восстановления этих структур.
Если вы не решаетесь использовать библиотеку, вы можете сделать все это вручную, но понимаете, что в конечном итоге вы можете написать много избыточного кода или разработать свою собственную библиотеку. См. fopen, fread, fwrite и fclose для отправной точки.
Типичным форматом двоичного файла для пользовательских данных является "индексированный формат файла", состоящий из
------- |index| ------- |data | -------
Где индекс содержит записи, «указывающие» на данные.
Индекс состоит из записей, содержащих смещение и размер. Смещение сообщает вам, где в файле хранятся данные, а размер указывает размер данных по этому смещению (то есть количество байтов для чтения).
typedef struct {
size_t offset
size_t size
} Index
typedef struct {
int ID
char First[20]
char Last[20]
char *RandomInfo
} Data
Предположим, вы хотите сохранить 50 записей в файле, вы создадите 50 индексов и 50 структур данных. Сначала в файл будут записаны 50 индексных структур, а затем 50 структур данных.
Чтобы прочитать файл, вы должны прочитать 50 структур индекса, а затем по данным в структурах индекса чтения вы можете сказать, где «искать» для чтения записей данных.
Найдите (fopen, fread, fwrite, fclose, ftell) функции для чтения / записи данных.
(Извините, моя точка с запятой не работает)
1985 позвонил и сказал, что у них есть некоторая помощь IFF, которую вы готовы прочитать. формат файла обмена все еще используется сегодня и предоставляет некоторые базовые метаданные для двоичных файлов, таких как аудио RIFF или WAV. (К сожалению, TIFF - ложный друг.) якобы даже вдохновил PNG, так что это не может быть так уж плохо.
Не сериализуйте вашу объектную модель. Одно изменение в вашей объектной модели, и вы можете читать старые отформатированные файлы.