2014-06-20 113 views
-2

我已經經歷了幾個小時的時間,試圖解決二進制文件操作的問題。用二進制文件讀寫對象

的任務是讀取和寫入BookStoreBook對象到/從二進制文件

BookStoreBook類包含以下成員變量:

string isbn; 
string title; 
Author author; 
string publisher; 
Date dateAdded; 
int quantityOnHand; 
double wholesaleCost; 
double retailPrice; 

看書代碼如圖所示:

fstream file("inventory.txt", ios::binary | ios::in | ios::out);  
vector<BookStoreBook> books: 
BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)]; 
file.read((char*)book, sizeof(BookStoreBook)); 
while (!file.eof()) 
{ 
    books.push_back(*book); 
    file.read((char*)book, sizeof(BookStoreBook)); 
} 

寫書的代碼如下所示:

vector<BookStoreBook> writeBooks = library.getBooks(); //library contains books 
file.close(); 
file.open("inventory.txt", ios::out | ios::binary); 

for(int i = 0; i < writeBooks.size(); i++) 
{ 
    BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)]; 
    book = &writeBooks[i]; 
    file.write((char*)book, sizeof(BookStoreBook)); 
    file.clear(); 
} 
file.clear(); 
file.close(); 

我不想任何字符串轉換爲c_str(),因爲這是在分配要求禁止。

一些注意事項:

權當我運行該程序,該程序會嘗試從文件中讀取書, 那就是當我們得到一個Windows錯誤窗口,後來當我調試,我得到的以下消息:在0x56b3caa4(msvcr100d.dll) 未處理異常FinalProject.exe:0000005:訪問衝突讀取位置0x0084ef10

有趣的是,有時在程序運行完全正常,並且 有時它崩潰時,它首先讀取文件中的書籍。

但是,無論何時程序成功讀取了一些內容,並且 我不修改書籍,然後重新打開該程序,該程序就保持 完美運行。

似乎沒有任何工作。請幫忙!

+0

你想在調試器中運行你的程序。 –

+1

當您的方法序列化指針時,您將序列化指針本身,但不是指向的內容。這就是這裏發生的事情,如果'string'意味着'std :: string'。 –

+0

實際上,我通過visual studio debuger得到了這個錯誤信息 – STIG

回答

4

這裏的問題在於BookStoreBook類的某些部分包含指針,即使它們不可見。例如std::string有一個指向保存字符串內容的內存位置的指針。

實際上,將C++中的數據結構寫入磁盤時,它們出現在內存中一直被認爲是不好的做法。這樣做並沒有考慮到不同機器的不同字節順序,不同機器上的字寬(intlong在32位和64位機器上的尺寸可能不同),並且會遇到所有指針問題。

你應該推每個BookStoreBook輸出流的領域,沿

file << book.isbn << ' '; 
file << book.title << ' '; 
... 

注意線,上面是非常不好的做法,因爲解碼變得可怕的困難。我建議你爲此使用Boost.Serialization,或編寫自己的方法來讀取/寫入文件中的鍵值對,或者您可能想要查看jsoncpptinyxml2。這整個話題會變得相當複雜,所以堅持使用Boost是一個好主意,即使只是想自己解決問題(假設這是一項家庭作業)。