如何将std::映射输出到二进制文件

How to output a std::map to a binary file?

本文关键字:输出 二进制文件 映射 std      更新时间:2023-10-16

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

map声明如下所示。

map<string, Account *> accounts;
ofstream os(outFileName.c_str());
os.write(  );

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

由于将其存储为指针,因此必须对映射进行迭代,首先存储键,然后逐个存储指向Account的键。

使用数据库似乎可以做得更好。尤其是如果你需要在多个地方这样做的话。

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

如果您的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
}

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

您想要做的也被称为序列化

在另一个论坛上查看这个帖子,它可能会帮助你

您需要一个接一个地输出它们。

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