[英]Writing struct of vector to a binary file in c++
我有一个结构,我想把它写成二进制文件(c ++ / visual studio 2008)。 结构是:
struct DataItem
{
std::string tag;
std::vector<int> data_block;
DataItem(): data_block(1024 * 1024){}
};
我用随机值填充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;
}
并尝试将结构写入文件:
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();
}
主要是:
int main()
{
DataItem data = createSampleData();
for (int i=0; i<5; i++) {
writeData(data,i);
}
}
因此,我期望文件大小至少为(1024 * 1024)* 4(对于矢量)+ 48(对于标签),但是它只是将标签写入文件,并向硬盘驱动器创建1KB文件。
我在调试时可以看到内容,但是它没有写入文件...
这段代码有什么问题,为什么我不能将strcut写入vector到文件? 是否有更好/更快或更有效的方式来编写它?
我是否必须序列化数据?
谢谢...
将std::string
为char *
不会产生预期的结果。 两者都不会在其上使用sizeof
。 对于std::vector
。
对于矢量,您需要使用std::vector::data
方法,或使用例如&data.data_block[0]
。 至于大小,请使用data.data_block.size() * sizeof(int)
。
但是写字符串是另一回事,特别是如果它可以是可变长度的话。 您必须将其写为固定长度的字符串,或者写入长度(以固定大小的格式),然后是实际的字符串,或者在字符串的末尾写一个终结符。 要获得指向字符串的C风格指针,请使用std::string::c_str
。
欢迎来到C ++ std的欢乐世界::
基本上,载体意味着用作不透明的容器。
您可以立即忘记reinterpret_cast
。
尝试关闭编译器将允许您创建可执行文件,但它会产生愚蠢的结果。
基本上,您可以忽略与迭代器有关的大多数std :: vector语法糖,因为您的fstream不会通过迭代器访问二进制数据(它将输出数据的文本表示形式)。
但一切都不会丢失。
您可以使用新引入的(C ++ 11).data()方法访问矢量基础数组,但这会使用opaque类型。
const int * raw_ptr = data.data_block.data();
这将为您带来100点的炫酷系数,而不是使用微不足道的
const int * raw_ptr = &data.data_block.data[0];
您还可以使用更加神秘的数据&data.data_block.front()
来获得50分的炫酷因子奖励。
然后你可以一次编写你的整体:
f.write (raw_ptr, sizeof (raw_ptr[0])*data.data_block.size());
现在,如果你想做一些非常简单的事情,试试这个:
for (int i = 0 ; i != data.data_block.size() ; i++)
f.write (&data.data_block[i], sizeof (data.data_block[i]));
这将消耗几微秒,这将在背景噪声中丢失,因为磁盘I / O将花费更多时间来完成写入。
完全不酷,但是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.