【问题标题】:Save objects from vector with pointers to file使用指向文件的指针保存向量中的对象
【发布时间】:2014-02-10 17:00:00
【问题描述】:

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

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@

【问题讨论】:

  • 你能告诉我们这个函数被调用后文件的样子吗?
  • 派生类的大小可能不同,因此这不起作用。此外,如果有任何成员是动态分配的或包含动态分配的内存(例如std::string),它也将不起作用。
  • 改用sizeof(*it);是的,正如 hmjd 提到的,如果您的类包含指针,则必须在序列化之前对其进行调整
  • 是的,它确实有动态分配的成员!
  • @Paranaix sizeof 是一个常量表达式,它返回 static 类型的大小,因此 sizeof(*it)sizeof(Product) 将计算出完全相同的值。

标签: c++ file pointers vector iterator


【解决方案1】:

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

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

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

【讨论】:

  • 我会在之前给出标识符方法,看看映射如何!谢谢您的时间。
【解决方案2】:

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

【讨论】:

  • 这是我试图存储的实际值,而不是指针。我第一次使用迭代器和向量,不确定特定的“写入”命令将什么保存到文件中。
  • 然后你需要获取实际值并将其提供给你的 ofstream 对象。我很惊讶它竟然会这样工作,因为您似乎将对象值从 Product 转换为 const char 指针。
  • 那么outfile &lt;&lt; (*it)-&gt;getCode(); 之类的东西会起作用吗?我的数据可以恢复吗?
  • @thebaconing 他写的东西会写一些字节到文件中;从这个意义上说,它会“工作”。然而,他不可能重读它们。例如,写vptr不会有帮助。
  • @Spapo 这取决于Product::getCode 在每个派生类中的作用。它当然可以工作(尽管我可能倾向于像(*it)-&gt;serialize( outfile ) 这样的东西)。但是您仍然面临着将什么放入不同的getCode 函数的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2021-05-20
  • 2011-02-11
相关资源
最近更新 更多