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

2024-04-28

我怎样才能输出一个std::map到二进制文件?

地图声明如下所示。

map<string, Account *> accounts;

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

我需要知道要放入什么write()让它按照我想要的方式工作。我需要输出类吗Account一对一或者我可以安全地将其输出为map?


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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 std::map 输出到二进制文件? 的相关文章

随机推荐