如何将std::map
输出到二进制文件?
地图声明如下所示。
map<string, Account *> accounts;
ofstream os(outFileName.c_str());
os.write( );
我需要知道要放入write()
函数的内容,让它以我想要的方式工作。我是否需要逐个输出课程Account
,还是我可以安全地将其输出为map
?
答案 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等。