0

我正在实现一个数据缓冲区,它从一个应用程序接收带有过程调用的音频数据包(没有网络协议,只有两个应用程序在同一台机器上运行),并将其放入 Struct 并写入映射文件。

所以编写器应用程序可能会调用我的应用程序的程序,这将是void writeData (DataItem data, Timestamp ts)每秒大约 15 次,每个数据项大小为 2MB。

我的应用程序应将数据存储到类似的结构中

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

并将其写入文件以供将来阅读。

因此,由于很难将结构按原样保存到文件中,因此我认为(?)我需要将其编写为二进制文件。所以我不确定我是否需要使用任何类型的序列化boost serialization

而且我不知道如何为内存映射文件对齐这些数据,以及如何重新构造数据以从文件中读取。

我在互联网上搜索,但找不到太多代码示例。示例代码将非常受欢迎。

顺便说一句,我使用的是嵌入式 Windows 7 x64 和 Visual Studio 2008。

谢谢...

4

3 回答 3

2

一种常见的 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 的文档以了解如何在单个大文件上使用 seek 等移动文件指针。
于 2014-01-27T13:42:38.640 回答
0

boost::serialization与文本存档一起使用。
是解决平台独立性的最“标准”方式。
可选,您可以在其上设置 gzip 压缩。

于 2014-01-27T15:40:32.920 回答
-1

你确定你问的是 C++ 而不是 C#?您的代码示例看起来像 C#

在 C++ 中,如果您的结构格式不会改变,那么您可以将数组写入磁盘。

这是您要求的示例,但这确实是C 101的东西

FILE* output=fopen ("myfile", "wb");
fwrite (array, sizeof (mystruct), number_of_elements_in_array, output);
fclose (output);
于 2014-01-27T08:33:23.617 回答