如何std::map
将 a 输出到二进制文件?
地图声明如下所示。
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
}
但是,如果您的对象具有任何指针成员,或具有指针成员的类型的任何成员,或任何子类或超类,或具有子类或超类的任何类型成员等,则此方法可能不够,并且可能会产生无意义或明显不正确的输出。
您想要做的也称为序列化
在另一个论坛中查看此主题,它可能对您有所帮助
您需要将它们一一输出。
二进制写入在任何(内部)包含指针的类上都不能正常工作。这当然包括 std::map、std::string 等。