1

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

地图声明如下所示。

map<string, Account *> accounts;

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

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

4

3 回答 3

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
}

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

于 2012-10-17T13:17:05.903 回答
1

您想要做的也称为序列化

在另一个论坛中查看此主题,它可能对您有所帮助

于 2012-10-17T13:18:12.230 回答
0

您需要将它们一一输出。

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

于 2012-10-17T13:15:16.637 回答