2017-01-27 110 views
0

我寫在Linux下C++程序中,我有一個結構命名列表:寫一個結構二進制文件和閱讀它

struct list{ 

    char names[20][20]; 
    int prices[20]; 
    int Num_Of_Merchandise; 
}; 

我做一個結構和初始化它的陣列和整數,然後我把它寫入一個文件。從那以後,我再次讀取結構做出了一些更改:

list new_list; 

ifstream ml("Desktop:\\Mlist.dat", ios::in | ios::binary); 

if(ml){ 
    ml.read(reinterpret_cast<char*>(&new_list),sizeof(new_list)); 
} 

int m,i; 
cout<<"1-add\n2-remove\n"; 
cin>>m; 
if(m==1){ 
    cout<< "enter the name of new merchandise:\n"; 
    cin>>new_list.names[new_list.Num_Of_Merchandise]; 
    cout<< "enter the price of new merchandise:\n"; 
    int newPrice; 
    cin>>newPrice; 
    new_list.prices[new_list.Num_Of_Merchandise]=newPrice; 
    new_list.Num_Of_Merchandise++; 
} 

但是當我在另一個程序(更改後)讀取文件,它給分段錯誤。爲什麼?我究竟做錯了什麼?

+0

所以這是值得一提的我們需要看到代碼也寫出來。我懷疑編譯器正在做一些魔術來使你的數組​​陣列起作用。此外,您不確定文件中的二進制數據是否與結構的佈局和位數相匹配。 – Mgetz

+0

我可以建議你看看boost :: serialization? – UKMonkey

+0

另外,請考慮使用Google Protobuf – alexeykuzmin0

回答

0

但是,當我在另一個程序(更改後)讀取文件時,它給出了分段錯誤。

你的示例代碼只顯示閱讀,沒有寫入 - 所以你的midifications不會被持久化。

如果您有書寫代碼,那麼很難說沒有看到您的another program代碼。如果你堅持它的文件格式規範,那麼我只能推薦將確保比對是不是一個問題在這裏,要做到這一點添加#pragma pack,這將在兩個MSVC工作和GCC:

#pragma pack(push) 
#pragma pack(1) 
struct list{ 
    char names[20][20]; 
    int prices[20]; 
    int Num_Of_Merchandise; 
}; 
#pragma pack(pop)