Запись в файл больше, чем просто текст - PullRequest
3 голосов
/ 16 сентября 2008

Мне всегда удавалось читать и писать основные текстовые файлы на C ++, но до сих пор никто не обсуждал намного больше, чем это.

Мой вопрос такой:

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

Ответы [ 14 ]

3 голосов
/ 16 сентября 2008

В основном вам нужно придумать свой собственный формат файла и записать двоичные данные. Вы также можете сериализовать вашу объектную модель и записать вывод в файл, но это обычно менее эффективно.

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

3 голосов
/ 16 сентября 2008

Вы должны знать двоичный формат файла для файла, который вы пытаетесь создать. Рассмотрим пост Джоэла на эту тему : формат файла 97-2003 - это спецификация на 349 страницах.

Почти все время, чтобы сделать что-то подобное, вы используете API, чтобы избежать тяжелой работы. Однако будьте осторожны, потому что метод проб и ошибок и определение «что работает» методом проб и ошибок могут привести к обновлению программы, что нарушит ваш код. Кроме того, необходимо учитывать другие операционные системы, незначительные различия версий, исправления и т. Д.

2 голосов
/ 16 сентября 2008

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

Или вы можете определить двоичные структуры данных и записать их непосредственно в файл.

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

2 голосов
/ 16 сентября 2008

Ну, вы можете хранить данные в формате, который вы можете прочитать, но который поддерживает целостность ваших данных (например, XML или JSON).

Или ( дрожь ) вы можете придумать свой собственный двоичный формат и использовать его.

2 голосов
/ 16 сентября 2008

Есть ряд стандартов, конечно. Скорее всего, вам пригодится какой-то вариант XML, поскольку уже существуют библиотеки и инструменты, которые помогут вам работать с ним, но ничто не мешает вам изобретать свои собственные.

1 голос
/ 16 сентября 2008

См. wotsit.org для получения информации о форматах файлов для различных типов файлов. Пример: Вы можете точно выяснить, как записать файл .BMP и как он составлен.

Запись в базу данных может быть выполнена с использованием класса-обертки на вашем языке, в основном передавая ему команды SQL.

0 голосов
/ 08 апреля 2014

1985 позвонил и сказал, что им нужна помощь, если вы готовы прочитать. формат файла обмена все еще используется сегодня и предоставляет некоторые основные метаданные вокруг двоичных файлов, такие как аудио RIFF или WAV. (К сожалению, TIFF - фальшивый друг.) Он предположительно даже вдохновил PNG, так что это не может быть так плохо.

0 голосов
/ 20 декабря 2008

Типичным двоичным форматом файла для пользовательских данных является «индексированный формат файла», состоящий из

-------
|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) функций для чтения / записи данных.

(Извините, моя точка с запятой не работает)

0 голосов
/ 16 сентября 2008

Существует множество подходов, которые вы можете использовать, но в общем случае вам понадобится какая-то библиотека для сериализации. BOOST :: Serialization или Protocal Buffers от Google являются хорошим примером этого. Основная идея заключается в том, что у вас есть структуры памяти (классы и объекты), которые представляют ваши данные, и вы хотите записать эти данные в файл таким образом, чтобы его можно было снова использовать для восстановления этих структур.

Если вы не решаетесь использовать библиотеку, вы можете сделать все это вручную, но понимаете, что в конечном итоге вы можете написать много избыточного кода или разработать собственную библиотеку. См. fopen, fread, fwrite и fclose для начальной точки.

0 голосов
/ 16 сентября 2008

Общая проблема обычно называется сериализацией состояния вашего приложения и в вашем случае с источником / целью файла в любом формате, который имеет смысл для вас. В настоящее время предпочтительным форматом ввода / вывода является XML, и вы можете посмотреть существующие стандарты в этой области. Тогда возникает проблема, как мне сопоставить состояние моей системы с конкретной схемой. Boost имеет платформу сериализации, которую вы можете попробовать.

/ Allan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...