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?是否有更好/更快或更有效的方式来编写它?
我是否必须序列化数据?
谢谢...
铸造一std::string
来char *
不会产生你所期望的结果.也不会使用sizeof
它.同样的std::vector
.
对于矢量,您需要使用std::vector::data
方法,或使用例如&data.data_block[0]
.至于尺寸,请使用data.data_block.size() * sizeof(int)
.
写字符串是另一回事,特别是如果它可以是可变长度的话.您必须将其写为固定长度的字符串,或者写入长度(以固定大小的格式),然后是实际的字符串,或者在字符串的末尾写一个终结符.获取指向字符串的C风格指针使用std::string::c_str
.
归档时间: |
|
查看次数: |
1533 次 |
最近记录: |