2012-08-13 120 views
0

我有以下結構讀/寫一個複雜的結構爲二進制文件

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

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

結構被一個結構含有的載體,結構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 * * 中止(核心轉儲)」 旁,不會將結構寫入文件。

+0

在可能的情況下,'std :: array'更傾向於'std :: vector'。 'std :: vector'管理動態分配的內存,而'std :: array'沒有。在這種情況下,它會使完成此操作的幼稚方法(轉換爲char /和寫/讀)工作。 – Kevin 2016-08-26 22:56:00

回答

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)); 
} 

請注意,我沒有任何包含錯誤檢查...此外,它會更C++ - 喜歡做這些功能的結構readwrite成員函數。

+0

實際上,我確實需要在該文件中寫入一個向量。 – David 2012-08-13 04:55:03

+0

是的,這就是我編輯中的所有額外代碼。你不能只轉儲矢量。這是一個內部指向記憶的類。如果你只是寫出來,你會寫指針,而不是它們指向的數據。當你讀回這些指針時,它們不再指向有效的內存。然後,當矢量超出範圍時,你會得到錯誤信息,因爲矢量釋放了它沒有請求的內存。我的解決方案將矢量的內容序列化出來,包括一個大小值,以便知道要讀回多少個元素。 – paddy 2012-08-13 05:09:11

+0

只需要清楚,我的答案中的第一個代碼塊就是一個替代方案...我的第二個代碼塊答案是如果你想使用矢量,你需要做什麼。 – paddy 2012-08-13 05:10:30