gpt4 book ai didi

c++ - 将 vector 结构写入C++中的二进制文件

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:12 25 4
gpt4 key购买 nike

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

struct DataItem
{
std::string tag;
std::vector<int> data_block;
DataItem(): data_block(1024 * 1024){}
};

我正在用随机值填充 data_block vector :

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(对于 vector )+ 48(对于标签),但它只是将标签写入文件并在硬盘驱动器上创建 1KB 的文件。

我在调试时可以看到其中的内容,但它不会将其写入文件...

这段代码有什么问题,为什么我不能将 strcut to vector 写入文件?有没有更好/更快或可能更有效的方式来编写它?

我必须序列化数据吗?

谢谢...

最佳答案

std::string 转换为 char * 不会产生您期望的结果。也不会在其上使用 sizeofstd::vector 也是如此。

对于 vector ,您需要使用 std::vector::data方法,或使用例如&data.data_block[0]。至于大小,使用data.data_block.size() * sizeof(int)

但是写入字符串是另一回事,尤其是当它的长度可变时。您要么必须将其写为固定长度的字符串,要么将长度(以固定大小的格式)写在实际字符串后面,或者在字符串的末尾写一个终止符。要获得指向字符串的 C 样式指针,请使用 std::string::c_str .

关于c++ - 将 vector 结构写入C++中的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21451438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com