2010-03-04 90 views
2

我已經看過二進制讀取和寫入對象的c + +但有一些問題。它「工作」,但另外我得到了錯誤/「信息」的巨大輸出。二進制讀/寫運行時失敗

我所做的是

Person p2; 

std::fstream file; 
file.open(filename.c_str(), std::ios::in | std::ios::out | std::ios::binary); 
file.seekg(0, std::ios::beg); 
file.read ((char*)&p2, sizeof(p2)); 
file.close(); 
std::cout << "Name: " << p2.name; 

人是含string nameint age一個簡單的結構。當我運行程序時,輸出「Name:Bob」,因爲我已經創建了一個寫入文件的程序(所以對象已經在文件名中)。

除了輸出也輸出名稱:

* glibc的檢測*方案:雙免費OG腐敗(fastttop):***

回溯:

...

存儲器映射:

...

中止

+1

不要重新鍵入代碼,它可以引入錯誤。 __Cut和Paste__代碼。對象的二進制讀取/寫入僅在結構不包含指針時纔有效。此規則必須遞歸應用於所有成員。因此,如果任何成員或成員成員或成員成員是一個指針,這將打破。如果沒有關於人的更多信息,很難說它是否真的有效。 – 2010-03-04 13:50:51

+0

向我們展示Person的聲明。 – 2010-03-04 13:56:25

+0

請記住,允許編譯器在結構,類和聯合中的字段之間插入填充。另一個問題是,字符串通常必須爲它們分配空間,讀入該空間,然後分配給結構,*除非文本字段是固定大小*。 – 2010-03-04 17:27:01

回答

3

Person結構中的名稱字符串是字符數組還是STL字符串?由於數據格式不可串行化(包含指針),因此無法通過二進制讀取數據填充STL字符串(包含指針)

0

p2.name是char *,並且您正在寫入並讀取指針值,而不是它指出的。或者p2.name是一個更復雜的類型,例如std :: string,它使用帶有相同問題的內部指針。

序列化類通常需要比轉儲內存表示更多的工作。

+0

但如果它是char名字[100],那可能會起作用。 – 2010-03-04 14:01:41

0

你說過你將Person對象寫入文件。您是否嘗試過使用轉儲工具來查看您在文件中的內容是否符合您的期望?

你也試過,而不是使用字符串,使用普通字符(如@bdk指出)?

1

看到如何將信息寫入文件以及如何構建Person結構將會很有趣。
如果你沒有任何問題,該文件是純文本,我的建議是寫入文件使用string::c_str()(它返回一個const char *)以及使用itoa()itoa_s()獲取整數作爲char * 。

你也可以有一個或幾個構造函數中的人:

Person(const std::string& name, int age); 
Person(const char* name, int age); 

那麼,當您從文件中提取數據,你只需要調用與數據的構造。

0

當您使用二進制IO時,大小必須是固定的。如果你在這裏使用STL字符串,它會有問題,因爲STL字符串的大小是任意的。