1

std::mapをバイナリファイルに出力するにはどうすればよいですか?

マップ宣言は次のようになります。

map<string, Account *> accounts;

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

関数を希望どおりに機能させるには、関数に何を入れればよいかを知る必要がありwrite()ます。クラスをAccount1 つずつ出力する必要がありmapますか?

4

3 に答える 3

3

ポインターとして保存しているため、マップを反復処理して、最初にキーを保存し、次にポイント先のアカウントを 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
}

ただし、オブジェクトにポインター メンバー、ポインター メンバーを持つ型のメンバー、サブクラスまたはスーパークラス、またはサブクラスまたはスーパークラスを持つ型のメンバーなどがある場合、このアプローチでは不十分であり、無意味な、または単純に正しくない出力のいずれかです。

于 2012-10-17T13:17:05.903 に答える
1

あなたがしたいことはシリアライゼーションとも呼ばれます

別のフォーラムでこのスレッドを確認してください。役立つ場合があります

于 2012-10-17T13:18:12.230 に答える
0

それらを1つずつ出力する必要があります。

バイナリ書き込みは、(内部的に) ポインターを含むクラスでは正しく機能しません。それには確かに std::map 、 std::string などが含まれます。

于 2012-10-17T13:15:16.637 に答える