gpt4 book ai didi

c++ - 在 C++ 中将对象 vector 保存到文件

转载 作者:行者123 更新时间:2023-11-28 02:29:03 25 4
gpt4 key购买 nike

我想将对象 vector 保存到文件中。最有效的方法是什么?我应该在程序启动时加载整个 vector,在本地对其进行操作,然后在程序退出时将其保存,还是每次需要更改 vector 内部的内容时都访问该文件?

此外,是否可以一次保存整个 vector ,或者我需要一个一个地保存元素?

最佳答案

如果您的数据是 POD(因此每个元素大小相同),您可以使用以下想法。否则,以下想法可能难以轻松使用。

以下代码显示您“可以”使用“ostream::write”将二进制数据输出到文件中。 vector<> promise 对象在内存中是从前到后(或从后到前,如您所愿),因此它们排成一行并且相对紧凑以进行传输。

读回内存是类似的,使用“istream::read”。但是在这里你需要首先分配缓冲。

在下面的代码中,我分配了 6 个对象用于写入,然后找到 vector 内存的开头,并一次“写入”将所有 6 个对象写入。

对于读取,我实例化了 6 个对象并将其加载到一个新 vector 中(请注意, vector 提供了一种更灵活的方式来使用默认构造函数分配和实例化对象)。

如何将写入工作量中的对象数量传递给读取工作量?这可以从文件大小计算出来。 (见统计)

使用 reinterpret-cast 是(通常) Not Acceptable ,并且可能不可移植。但有时你只需要这样做。

希望这种“邪恶”会促使一些更好的选择。

我留下了一些调试 std::cout 的......希望你觉得它们有用。

编辑 - 4/8 -- 稍微清理了代码

       // create a vector of 6 clear elements to save to file
std::vector<Something> vec6W(6); // default ctor clears contents

// change several elements by init'ing them
vec6W[0].init();
// [1] is clear (all 0's)
vec6W[2].init();
vec6W[3].init();
// [4] is clear (all 0's)
vec6W[5].init();

std::cout << " vec6W.size(): " << vec6W.size() << std::endl; // 6
std::cout << " sizeof(vec6W): " << sizeof(vec6W) << std::endl; // 12
std::cout << " sizeof(something): " << sizeof(Something) << std::endl; // 100
std::cout << " sizeof(vec6W[3]): " << sizeof(vec6W[3]) << std::endl; // 100

// #elements bytes per element
std::streamsize nBytes = (vec6W.size() * sizeof(Something));
std::cout << " nBytes : " << nBytes << std::endl; // 600

// simulate a file using
std::stringstream ss;

// note size
std::cout << " ss.str().size(): " << ss.str().size() << std::endl; // 0

// identify address of 1st element of vector
// cast to a 'const char*' for 'write()' method
const char* wBuff = reinterpret_cast<const char*>(&vec6W[0]);

// report address
std::cout << " static_cast<const void*>(wBuff): " << std::hex
<< static_cast<const void*>(wBuff) << std::dec << std::endl;

//write vector to ss
ss.write(wBuff, nBytes);

std::cout << "\n note ss content size change " << std::endl;
std::cout << " ss.str().size() : " << ss.str().size() << std::endl;

// //////////////////////////////////////////////////////////////////
// build a vector of 6 clear elements to create buffer for read from file
std::vector<Something> vec6R(6);

// identify address of 1st element of vector
std::cout << " &vec6R[0] : " << std::hex << (&vec6R[0]) << std::dec << std::endl;

char* rBuff = reinterpret_cast<char*>(&vec6R[0]);

// read vector from ss
(void)ss.read(rBuff, nBytes); // read back same number of bytes

// //////////////////////////////////////////////////////////////////
// confirm vec6R matches what was written vec6W
int diff = memcmp(wBuff, rBuff, nBytes);

std::cout << (diff ? "FAILED" : "wBuff MATCHES rBuff: SUCCESS") << std::endl;

// now consider comparing vec6R to vec6W element by element

当类具有虚方法时,可能会出现其他问题。

祝你好运。

编辑 -----

可以处理指针,但会产生额外的工作和一些不对称性。

相关工作可能被称为“持久存储”。

此外,还有一些工具可以简化非 POD 数据的附加步骤(抱歉,我忘了名字。)

关于c++ - 在 C++ 中将对象 vector 保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29488365/

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