2015-02-24 120 views
1

你好,大家好我新的C++中的二進制文件編程 我有救結構.. 但是,當嘗試讀取它的應用程序崩潰 這裏是我的代碼C++結構二進制文件

struct Person 
{ 
    string name; 
    int age; 

}; 
void main() 
{ 
    Person p; 
    ifstream is("person.data",ios::binary); 
    is.read((char*)&p,sizeof(p)); 


} 
+2

你需要看看***序列化***。您不能將複雜的類作爲二進制圖像保存到文件中。 – 2015-02-24 19:24:15

回答

4

你使用sizeof(p)

string類的長度是可變的。這意味着它本質上是一個結構,其中有一個指向堆中其他字符的指針。嘗試讀取via結構中的字符串將不起作用。您必須將所有字符放在結構本身中,否則它只會讀入一個(現在已死的)指針,指向堆中的某處並可能導致分段錯誤。

嘗試這種情況:

struct Person 
{ 
    char name[40]; 
    int age; 

}; 
void main() 
{ 
    Person p; 
    ifstream is("person.data",ios::binary); 
    is.read((char*)&p,sizeof(p)); 
} 

然後使用在cstringstring.h實測值:C字符串函數而不是C++的。老實說,雖然你可能想聽@πάνταῥεῖ。不過,你正在嘗試序列化 C結構。在via結構體中讀取數據是一個非常「C」的事情,但是你需要在其中混合使用「C++」類。這兩種範例不能很好地結合。 BOOST has a serialization library,如果你真的想序列化C++類,我會從那裏開始。

+0

謝謝,它對我有用 – 2015-02-24 19:30:28

+0

接受答案? :) – djhaskin987 2015-02-24 19:31:46