Мне было интересно, было ли хорошей идеей загрузить / сохранить массив определенного типа структуры с помощью fstream. Обратите внимание, я говорю о загрузке / сохранении в двоичный файл. Должен ли я загружать / сохранять независимые переменные, такие как int, float, boolean, а не структуру? Я спрашиваю об этом потому, что слышал, что у структуры может быть какой-то заполнитель, который может компенсировать сохранение / загрузку.
Это хорошая идея - сохранить / загрузить массив структур?
Ответы (5)
Структура может содержать заполнение, которое будет записано в файл. В этом нет ничего страшного, если файл будет считываться на той же платформе, используя код, выданный тем же компилятором, который выполнял запись. Однако это сложно гарантировать, и если вы не можете этого гарантировать, вы должны обычно записывать данные в каком-либо текстовом формате, таком как XML, json или что-то еще.
Без сериализации ваши двоичные данные не будут переноситься на другую платформу (и компиляторы). Поэтому, если вам нужна переносимость, вам необходимо сериализовать данные, прежде чем сохранять их в файле как двоичный.
Взгляните на это:
Он не устарел (он не является частью какой-либо формальной спецификации, где он должен быть устаревшим?), Но он крайне непереносим и, вероятно, худший способ сериализации вещей. Используйте Boost.Serialization или аналогичную библиотеку.
Как вы указали в своем ответе, это произойдет с написанием структур таким образом. Если вы хотите, чтобы ваши файлы можно было переносить на разные платформы, например файл, записываемый на Linux i686 и открываемый Solaris на Sparc, тогда даже запись отдельных чисел с плавающей запятой не сработает.
Попробуйте записать свои данные в текст, например в текст или XML, а затем заархивировать / архивировать файлы, чтобы сделать из них один документ.
Как сказал Нил, предпочитаю текстовое представление данных. Формат XML может быть излишним. Более простые версии - это значения, разделенные запятыми (CSV), и одно значение в каждой текстовой строке.
struct
илиPOD
- это область памяти, в которой элементы расположены непрерывно. Двоичный ввод-вывод выводится из области памяти, без ограничений (доступ к недопустимым участкам памяти перехватывается платформой или ОС). - person Thomas Matthews   schedule 24.05.2011