在c ++中将向量结构写入二进制文件

Vec*_*ihi 2 c++ serialization struct file vector

我有一个结构,我想把它写成二进制文件(c ++/visual studio 2008).结构是:

struct DataItem
{
  std::string tag;        
  std::vector<int> data_block;
  DataItem(): data_block(1024 * 1024){}
};
Run Code Online (Sandbox Code Playgroud)

我用随机值填充data_block向量:

DataItem createSampleData ()
{   
    DataItem data;  
    std::srand(std::time(NULL));
    std::generate(data.data_block.begin(), data.data_block.end(), std::rand);   
    data.tag = "test";
    return data;
}
Run Code Online (Sandbox Code Playgroud)

并尝试将结构写入文件:

void writeData (DataItem data, long fileName)
{
    ostringstream ss;
    ss << fileName;
    string s(ss.str());
    s += ".bin";

    char szPathedFileName[MAX_PATH] = {0};
    strcat(szPathedFileName,ROOT_DIR);
    strcat(szPathedFileName,s.c_str());
    ofstream f(szPathedFileName, ios::out | ios::binary | ios::app);            
    // ******* first I tried to write this way then one by one  
    //f.write(reinterpret_cast<char *>(&data), sizeof(data));
    // *******************************************************
    f.write(reinterpret_cast<const char *>(&data.tag), sizeof(data.tag));
    f.write(reinterpret_cast<const char *>(&data.data_block), sizeof(data.data_block));
    f.close();
}
Run Code Online (Sandbox Code Playgroud)

主要是:

int main()
{
    DataItem data = createSampleData();
    for (int i=0; i<5; i++) {
         writeData(data,i); 
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我希望文件大小至少为(1024*1024)*4(对于向量)+ 48(对于标记),但它只是将标记写入文件并创建1KB文件到硬盘驱动器.

我在调试时可以看到内容,但它没有写入文件...

这段代码出了什么问题,为什么我不能将strcut写入vector to file?是否有更好/更快或更有效的方式来编写它?

我是否必须序列化数据?

谢谢...

Som*_*ude 6

铸造一std::stringchar *不会产生你所期望的结果.也不会使用sizeof它.同样的std::vector.

对于矢量,您需要使用std::vector::data方法,或使用例如&data.data_block[0].至于尺寸,请使用data.data_block.size() * sizeof(int).

写字符串是另一回事,特别是如果它可以是可变长度的话.您必须将其写为固定长度的字符串,或者写入长度(以固定大小的格式),然后是实际的字符串,或者在字符串的末尾写一个终结符.获取指向字符串的C风格指针使用std::string::c_str.