0

私はベクトルを持っています:

class Element
{
public:

    string pathName;
    ui64 offsitePtr;
    ui64 subPage;

public:

    Element(void);

    ~Element(void);
};

vector<Element> elem;

のサイズはelem4096 バイト未満に制御されます。プログラムの最後にfwrite elem、バイナリ ファイルを作成する必要があります。私が現在使用している解決策は、char バッファーを作成し、その中に要素を書き込むelemことです。私はそれが良い考えだとは思いません。他に何か良いアイデアはありますか?

4

1 に答える 1

0

vector やElements をメモリから直接書き込まない限り、問題ありません。POD (プレーン オールド データ) ではないものはすべてシリアル化する必要があります。それはあなたの場合です:vectorそしてstring

の関数を作るだけなので、ベクトルは簡単ですElement。しかし、ベクトル サイズをシリアル化したい場合があります。

ofstream& WriteVec( ofstream& s, vector<Element> &elem )
{
    size_t size = elem.size();
    s.write( (char*)&size, sizeof(size) );
    for( int i = 0; i < size; i++ )
        elem(i).Write(s);
    return s;
}

あなたの要素のために:

ofstream& Element::Write( ofstream& s )
{
    // Serialize pathName
    size_t strsize = pathName.size();
    s.write( (char*)&strsize, sizeof(strsize) );
    s.write( pathName.c_str(), strsize );

    // Serialize other stuff
    s.write( (char*)&offsitePtr, sizeof(offsitePtr) );
    s.write( (char*)&subPage, sizeof(subPage) );
}

そして、あなたは読むときに似たようなことをします。それを解決するのはあなたに任せます =) いずれの場合も、サイズを書いてからデータを書いていることに注意してください。読むときは、サイズを読み込んでから、内容を読み込む前に構造のサイズを変更します。

ああ、ファイル ストリームをバイナリ モードで開いていることを確認してください。

于 2012-10-26T02:46:39.147 に答える