C ++ структура сериализации

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

Таким образом, приложение-писатель может вызвать процедуру моего приложения, что-то вроде void writeData (DataItem data, Timestamp ts) примерно 15 раз в секунду с размером каждого элемента данных 2 МБ.

Мое приложение должно хранить данные в виде структуры

Struct DataItem
{
long id;
...  Data;
Time  insertTime;
}

и запишите его в файл для дальнейшего чтения.

Поэтому, поскольку трудно сохранить структуру в файле как есть, я думаю (?) Мне нужно записать ее в двоичном виде. Так что я не уверен, что мне нужно использовать какой-либо сериализации, как boost serialization или нет?

И я не знаю, как выровнять эти данные для файлов карты памяти и как восстановить данные для чтения из файла.

Я ищу в интернете, но не могу найти много примеров кода. И образец кода будет очень ценным.

Кстати, я использую встроенную Windows 7 x64 и Visual Studio 2008.

Спасибо…

0

Решение

Обычный способ сериализации в C ++:

struct myStruct
{
int         IntData;
float       FloatData;
std::string StringData;
};

std::ostream& operator<<(std::ostream &os, const myStruct &myThing)

{
os
<< myThing.IntData      << " "<< myThing.FloatData    << " "<< myThing.StringData   << " ";
return os;
}

std::istream& operator>>(std::istream &is, myStruct &myThing)
{
is
>> myThing.IntData
>> myThing.FloatData
>> myThing.StringData;

return is;
}void WriteThing()
{
myStruct myThing;

myThing.IntData = 42;
myThing.FloatData = 0.123;
myThing.StringData = "My_String_Test";

std::ofstream outFile;
outFile.open("myFile.txt");

outFile << myThing;
}

void ReadThing()
{
myStruct myThing;

std::ifstream inFile;
inFile.open("myFile.txt");
inFile >> myThing;
}

Пожалуйста, обратите внимание:

  • std :: string определяет операторы << и >> Те будут называться в
    код выше.
  • Потоки будут обрабатывать символы пробела как разделители. Хранение строк с пробелами потребует дополнительной обработки
  • Если вы планируете хранить ваши данные через обновления вашего
    программное обеспечение, вы должны реализовать какое-то управление версиями файлов
  • обратитесь к документы Fstream чтобы узнать, как переместить указатель файла
    используя поиск и т. д. на одном большом файле.
0

Другие решения

использование повышение :: сериализации с текстовым архивом.
Является наиболее «стандартным» способом решения независимости платформы.
Необязательно, вы можете установить сжатие gzip поверх него.

0

Вы уверены, что спрашиваете о C ++, а не о C #? Ваш пример кода выглядит как C #

В C ++ Если ваш структурный формат не изменится, вы можете просто записать массив на диск.

вот пример, как вы просили, но это действительно C 101 материал

FILE* output=fopen ("myfile", "wb");
fwrite (array, sizeof (mystruct), number_of_elements_in_array, output);
fclose (output);
-1
По вопросам рекламы [email protected]