2012-12-26 14 views
1

我想製作一個程序來存儲僱員的數據庫並將它們存儲在外部文件中。從.dat文件讀取矢量並將其加載到程序中的函數將讀取文件,但每當我嘗試顯示或修改加載的矢量時,程序都會崩潰。當我嘗試輸出從文件讀取的數據時,我的C++程序崩潰

//displays vector 
void Database:: displayAll() const 
{ 
    for(std::vector<Employee>::const_iterator iter = mEmployees.begin(); iter != mEmployees.end(); ++iter) 
    { 
     iter -> display(); 
    } 

} 

std::vector<Employee> mEmployees; 

void Database::readData() 
{ 
    ifstream empIn("employee.dat" , ios::binary); 
    empIn.seekg(0,ifstream::end); 
    long size2 = empIn.tellg(); 
    empIn.seekg(0,ifstream::beg); 
    mEmployees.resize(size2); 
    empIn.read((char*)&mEmployees, size2); 
    empIn.close(); 
    cout << mEmployees.size() << endl; //this tests whether or not it reads. 
} 
+0

你是不是改變寫入數據的代碼引入同樣的錯誤?請注意,到目前爲止您編寫的任何數據都將無法使用(因爲您實際上已經編寫了一堆隨機字節) –

回答

3

你還沒有向我們展示你的宣言的mEmployees,但我相信它的某種形式的std::vector。問題在於您正嘗試將文件讀入vector對象,而不是其內容。這將破壞vector以及其他任何旁邊的內存,導致進一步崩潰。

你可能要代替的是:

empIn.read((char*)&mEmployees[0], size2); 

C++ 11

empIn.read((char*)mEmployees.data(), size2); 

實際讀取內容的文件的內容vector

爲了理解爲什麼發生這種情況,你應該知道,內容vector不存儲在vector本身內(他們怎麼可能?大小是動態的)。相反,vector的一個通用實現指向了存儲區域的開始和結束,在存儲區域的某個地方,內容實際上被保存在該存儲區域中。當您嘗試將文件讀入vector的內存佈局時,您將覆蓋這些指針以及vector本身之外的內存,從而破壞了矢量等等。

0

轉換爲(char*)會告訴編譯器放棄它通常會執行的類型檢查。由於ifstream要求您通過char*,所以在這種情況下需要執行演員。問題是,這reinterpret_cast是一個相當鈍的工具,並沒有提醒你,當你打算從Employee*轉換時,你從vector<Employee>*轉換。

請記住,像這樣的轉換是低級操作,其目的是告訴編譯器「即使看起來錯誤,你知道自己在做什麼」。應特別小心使用它們。

一個更好的,和糾正,形式你在做什麼會是:

empIn.read(reinterpret_cast<char*>(&mEmployees[0]), mEmployees.size()); 
+0

我試過了,它阻止了我的程序崩潰,但是當我調用函數來顯示內容時它只顯示一個隨機的字符串。 – dashingbag

+0

@aceassasin:您尚未顯示試圖顯示內容的代碼。通常,這將不得不一次顯示mEmployee一個字段的內容並一次顯示一條記錄。 – nobar

相關問題