【问题标题】:How to output a std::map to a binary file?如何将 std::map 输出到二进制文件?
【发布时间】:2012-10-07 18:08:26
【问题描述】:

如何将std::map 输出到二进制文件?

地图声明如下所示。

map<string, Account *> accounts;

ofstream os(outFileName.c_str());
os.write(  );

我需要知道在write() 函数中添加什么才能让它按照我想要的方式工作。我需要一个接一个地输出Account 类,还是将其输出为map 是否安全?

【问题讨论】:

  • @Jeff:你不能只是在代码块中随机放置缩写,然后称之为编辑。
  • 我不确定您对Account* 的意图是什么。如果你想让 this 成为一个指针,为什么不使用 C++ 的智能指针呢?或者,如果您打算将此作为一个数组,那么 std::vector 应该可以解决问题。
  • @chrisaycock:这个问题没有标记为 c++11,也没有提到它,所以可以安全地假设智能指针不可用。它几乎可以肯定只是一个指向单个对象的标准指针。
  • @Wug C++03 有std::auto_ptr
  • @chrisaycock:你不会希望在地图中有 auto_ptr。

标签: c++ file stl map binary


【解决方案1】:

由于您将其存储为指针,因此您必须遍历映射,首先存储密钥,然后是指向的帐户,一个接一个。

这似乎可以用数据库做得更好。特别是如果您需要在多个地方执行此操作。

对对象执行此操作的做法称为序列化。

如果您的 Account 类是所谓的普通旧数据类(即,除了其他普通旧数据类和结构外,它不包含指针和类或结构),您可以简单地将其内存直接写入文件。在这种情况下,可以接受如下方法:

int32_t sizeAccount = sizeof(Account); // this should always be a 32 bit int
for (map<string, Account *>::iterator i = accounts.begin(); i != accounts.end(); ++i)
{
    int32_t sizeStr = i->first.length() + 1; // this should always be a 32 bit int

    os.write(&sizeStr, sizeof(sizeStr)); // 4 byte length of string
    os.write(i->first.c_str(), sizeStr); // null terminated string

    os.write(&sizeAccount, sizeof(sizeAccount)); // 4 byte size of object
    os.write(i->second, sizeAccount);    // object data itself
}

但是,如果您的对象具有任何指针成员,或具有指针成员的类型的任何成员,或任何子类或超类,或具有子类或超类的任何类型成员等,则此方法可能还不够并且可能会产生无意义或完全不正确的输出。

【讨论】:

    【解决方案2】:

    你想做的也叫Serialization

    Check this在另一个论坛发帖,可能对你有帮助

    【讨论】:

      【解决方案3】:

      你需要一一输出。

      二进制写入在任何(内部)包含指针的类上都不能正常工作。这当然包括 std::map、std::string 等。

      【讨论】:

      • acounts[0] 不合法,因为 0 不是字符串。您需要使用迭代器以及 begin 和 end 方法。
      • 我没有关注?如果我这样做 os.write(把东西放在这里)
      • 嗯,是的,您需要“在这里放一些东西”。不幸的是,如果没有看到您对Account 的定义,没有人能说出您需要放什么。
      • 类账户 { public: Account(); 〜帐户();帐户(int,int,string,string,int,string,double); //提取算子>>朋友istream&算子>>(istream& is, Account& accObj); //插入操作符
      • 好的,看看每个数据成员(BSB、Acc、Name 等),每个都必须使用单独的 os.write() 语句输出。事实上,字符串可能需要两个 os.write() 语句。一个用于长度,一个用于字符。请记住,对于二进制文件格式没有唯一的答案。您必须设计格式。而正确的答案取决于你如何设计文件格式。
      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多