0

私は次の構造体を持っています

typedef struct a_t
{
    vector <int> a;
    int p;
}a;

typedef struct b_t
{
    a x;
    int y;
}b;

構造体aはベクトルを含む構造体であり、構造体bは構造体を含みます。構造体bをバイナリファイルに書き込み/読み取ります。次のコードは機能しません

int main()
{

    b m;
    m.x.a.push_back(1);
    m.x.a.push_back(2);
    m.x.a.push_back(3);
    m.x.p = 5;
    m.y = 7;
    cout << sizeof(m.y) << endl;
    cout << sizeof(m.x) << endl;
    cout << sizeof(m) << endl;
    ofstream outfile("model",ios::out|ios::binary);
    outfile.write((char*)&m,sizeof(m));
    outfile.close();


    b p;
    ifstream iffile("model", ios::in|ios::binary);
    iffile.read((char*)&p,sizeof(a));
    iffile.close();

    cout << p.y << endl;;
    cout << p.x.p << endl;
    cout << p.x.a[0] << endl;
    cout << p.x.a[1] << endl;
    cout << p.x.a[2] << endl;
    return 0;
}

エラーメッセージは「*glibcが検出されましたダブルフリーまたは破損(上):0x0000000000504010 * *中止(コアダンプ) "の横に、構造体をファイルに書き込みません。

4

1 に答える 1

1

ベクターはヒープにデータを割り当てるため、ベクターの書き込みと読み取りはできません。アプリケーションに実際の制限がある場合は、通常の C 配列を使用する方が良いと判断する場合があります (速度と明確さのために、ストレージを犠牲にする可能性があります)。

#define MAXARR_A 100

typedef struct a_t
{
    int a[MAXARR_A];
    int p;
} a;

それ以外の場合は、サイズを書き出してから配列データをダンプすることにより、ベクターをシリアル化する必要があります。それを読み戻すには、サイズを読み取り、次にベクトルのサイズを変更してバイトを読み取ります。

編集:あなたのためにいくつかのコードを追加することにしました...コンパイルできるかもしれません!=)

void write_a( a& data, ostream& s )
{
    size_t len = data.a.size();
    s.write( (char*)&len, sizeof(len) );
    s.write( (char*)&data.a[0], len * sizeof(int) );
    s.write( (char*)&data.p, sizeof(int) );
}

void write_b( b& data, ostream& s )
{
    write_a( data.x, s );
    s.write( (char*)&data.y, sizeof(int) );
}

void read_a( a& data, istream& s )
{
    size_t len;
    s.read( (char*)&len, sizeof(len) );
    data.a.resize(len);
    s.read( (char*)&data.a[0], len * sizeof(int) );
    s.read( (char*)&data.p, sizeof(int) );
}

void read_b( b& data, istream& s )
{
    read_a( data.x, s );
    s.read( (char*)&data.y, sizeof(int) );
}

エラーチェックを含めていないことに注意してください...また、これらの関数を構造体のメンバー関数readとして作成する方がC++に似ています。write

于 2012-08-13T04:23:41.040 に答える