std::map
をバイナリファイルに出力するにはどうすればよいですか?
マップ宣言は次のようになります。
map<string, Account *> accounts;
ofstream os(outFileName.c_str());
os.write( );
関数を希望どおりに機能させるには、関数に何を入れればよいかを知る必要がありwrite()
ます。クラスをAccount
1 つずつ出力する必要がありmap
ますか?
ポインターとして保存しているため、マップを反復処理して、最初にキーを保存し、次にポイント先のアカウントを 1 つずつ保存する必要があります。
これは、データベースを使えばもっとうまくできるように思えます。特に、複数の場所でこれを行う必要がある場合。
オブジェクトでこれを行う方法は、シリアライゼーションとして知られています。
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つずつ出力する必要があります。
バイナリ書き込みは、(内部的に) ポインターを含むクラスでは正しく機能しません。それには確かに std::map 、 std::string などが含まれます。