2015-11-19 83 views
-1

我正在爲該類製作該程序,並且我們應該將類中的對象存儲在文件中,然後加載它們。但我總是得到存儲的最後一個對象而不是第一個。嘗試seekp功能,但它不起作用。也不應該是一個對象的大小爲38個字節,而不是我得到的48個?從文件中存儲和加載對象

void student::load() 
{ 
fstream fin; 
fin.open("StudentData.bin",ios::binary|ios::in); 
fin.read((char*)this,sizeof(*this)); 
} 
void student::store(int z) 
{ 
fstream fout; 
fout.open("StudentData.bin",ios::binary|ios::out); 
//fout.seekp(38*z, fout.beg) 
cout<<sizeof(*this); 
fout.write((char*)this,sizeof(*this)); 
} 


for(i=0;i<count;i++) 
{ 
    s[i].store(i); 
} 
cout<<"Done!"; 
student pleb; 
pleb.load(); 
pleb.showstudent(); 
return 0; 

}

+0

我想,每個到'fout.open'調用覆蓋文件 – Petr

回答

0

fout.open()重寫每次文件。如果你想追加到文件,也就是讓每個store()調用寫student後已經寫其他的學生,那麼你可以使用ios::app標誌。

或者,更好的,不store()打開該文件在所有。使您的store()執行接受流作爲參數;然後在主程序中打開該文件(每個學生一次)並將該流傳遞給store()。這不僅可以解決您的問題,而且還可以使您的類更具可配置性,因爲它很容易寫入任何文件,或者通常寫入任何需要使用student的用戶。

順便說一句,還請確保它是正確以這種方式編寫您的student s。例如,如果您的student中包含任何指針(包括std::string成員,因爲它們內部有指針),則不會達到預期的效果。

爲對象的大小,它是不可能回答沒有看到student類的整體宣言。

+0

4整數和30個字符。採取了你的建議,似乎無法通過一個流作爲論據壽。 – Metafity

+0

@Yolo,「4個整數和30個字符」聽起來更像46個字節,因爲在現代系統中'int'最可能是4個字節。但是你最好把它作爲一個單獨的問題,並且包括整個'學生'類定義。爲了不傳遞流,這很奇怪。只要確保將它傳遞給reference_:'student :: store(int z,fstream&fout)' – Petr