使用指向文件的向量保存向量中的对象

时间:2014-02-10 17:00:01

标签: c++ file pointers vector iterator

我有一个带有指向基类对象的向量,因此我可以管理从该类派生的对象。

vector <Product*>  products;

我正在尝试将这些对象写入文件,同时迭代向量 但我不确定这是否正常。

void Inventory ::  saveProductsToFile()
 {
    ofstream outfile;
    outfile.open("inventory.dat",ios::binary);

    list <Product*> :: iterator it;
    for(it=products.begin(); it!=products.end(); it++)
        outfile.write((char*)*(it),sizeof(Product));
 }

该文件已创建,但我不知道我是否保存了实际对象本身或其自身 地址。这是正确的还是有另一种方式?

这是文件的样子:

ˆFG "   H*c     \Âõ(œ@@pFG    h*c b'v      b@

2 个答案:

答案 0 :(得分:1)

你的代码可以工作。您无法序列化多态对象 那样。对于初学者,您正在编写隐藏的vptr 到磁盘;当您重读数据时,它将无效。和 你只是写出基类(Product)中的数据, 因为这是sizeof(Product)评估的内容。和 最后,只写一个除char[]以外的任何字节图像 可能意味着您将无法重读数据 未来的某个时间(在编译器升级或机器之后) 升级,或其他)。

您需要做的是为其定义格式(二进制或文本) 该文件,写下来。对于基本类型,您可以开始 有现成的东西,比如XDR或协议缓冲区,但是 这些都不适用于多态类型。对于 多态类型,你必须从定义你的方式开始 在重读时识别有问题的类型。这可以 棘手:std::type_info中的任何内容都没有帮助,所以你 需要一些方法来建立你的关系 (派生)类型和标识符。然后每个派生类 必须实现write函数,该函数首先写入其类型, 然后逐个一个地写出它的数据。在阅读时,你 读取类型,查找相应的读取函数 键入地图,然后调用该函数,然后读取数据 一个接一个。

最后,我可能会指出所有成功的序列化 我见过的方案取决于生成的代码。你形容你的 单独文件中的类型,或特殊标记中的类型 在C ++中标记注释,并有一个程序,读取, 并生成必要的代码(通常是实际的类 你用)。

答案 1 :(得分:0)

这不是你如何“序列化”数据。像这样,指针只在运行时或者删除它们之前有效(取决于先发生/停止的情况)。像这样你将无法恢复你的数据,因为在程序停止后,你以前的内存中的所有内容都变得无效。您必须存储班级中的实际值。