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

时间:2012-10-17 13:09:56

标签: c++ file stl map binary

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

地图声明如下所示。

map<string, Account *> accounts;

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

我需要知道要放入write()函数的内容,让它以我想要的方式工作。我是否需要逐个输出课程Account,还是我可以安全地将其输出为map

3 个答案:

答案 0 :(得分:3)

由于您将其存储为指针,因此您必须遍历地图,首先存储密钥,然后逐个存储指向的帐户。

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

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

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

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

答案 1 :(得分:1)

您想要做的事也称为Serialization

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

答案 2 :(得分:0)

您需要逐个输出它们。

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