【问题标题】:Outputting an object (pointer) in a map to a binary file将映射中的对象(指针)输出到二进制文件
【发布时间】:2012-10-26 11:01:22
【问题描述】:

我有一个带有指向类对象的指针的映射,我试图将它们全部输出到二进制文件中,然后将它们读回。我不相信我的语法是正确的,因为当我读回它们时它们被破坏了,即在它们进入文件之前似乎没有任何数据。在此之前的行我遍历数据并将它们全部输出,所以我知道它们在打印之前没问题

这是将帐户输出到二进制文件的代码。

for (it = accounts.begin(); it != accounts.end(); it++)
{
    outFile.write((char*)&(*it).second, sizeof(Account));
}

有人知道这样好吗?

编辑:事实并非如此

for (it = accounts.begin(); it != accounts.end(); it++)
{
    outFile.write((char*)&(*(it->second)), sizeof(Account));
}

【问题讨论】:

    标签: c++ class object map iterator


    【解决方案1】:

    这不是你序列化对象的方式有几个原因:

    • 如果对象是多态的,大多数(所有?)实现都会有一个指向对象内部虚拟表的指针,所以你写了它,但是当你读回它时,它不再有效。
    • 其他指向成员的指针已写入,但当您读回它们时没有意义。

    序列化不像将对象的字节写入文件那么容易。

    简单的解决方案是使用现有库 - 想到 google protocol buffers

    另一种方法是自己实现,但这很困难,尤其是如果您希望在多个平台/操作系统上获得支持。

    【讨论】:

    • 我应该说,程序本身会读回它,所以它知道类的定义..它似乎没有写任何东西。我以前写过一个较小的程序,它成功地做到了,但我认为我已经和指针地址等混淆了,因为另一个程序直接写了对象而不是弄乱了指针,所以我迷路了。
    • @user1623990 正如所指出的,在类中有指针会搞砸。
    • 类本身不包含指针,映射包含指向对象的指针
    【解决方案2】:

    您似乎正试图将转换为char* 的内存地址写入文件。这些数字将没有任何意义。大概你想序列化那些指针指向的对象。所以首先你需要找到一种方法来序列化和反序列化该类型的对象,然后通过重新引用映射中保存的指针将它们写入文件。

    【讨论】:

    • 是的,我以为我在写内存地址,这不是我想做的。以前我输出了一个像“out.write((char*)&anEmployee, sizeof(Employee));”这样的对象但是当指针和地图涉及时,它就非常混乱
    【解决方案3】:

    您将看到内存地址,仅此而已。您必须编写更复杂的方法。请参阅Google protobuf encoding 了解一些想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2017-05-13
      • 1970-01-01
      • 2021-11-26
      • 2018-01-26
      相关资源
      最近更新 更多