2017-01-24 166 views
0

我正在寫一個陣列自動對焦結構(因素是結構)二進制文件是這樣的:如何將結構數組寫入二進制文件並再次讀取?

factor factors[100]; 

ofstream fa("Desktop:\\fa.dat", ios::out | ios::binary); 
fa.write(reinterpret_cast<const char*>(&factors),sizeof(factors)); 

fa.close(); 

我運行該程序,並保存5個記錄它,在另一個文件,我想讀結構,所以我寫了這個:

int i=0; 
ifstream a("Desktop:\\fa.dat", ios::in | ios::binary); 

factor undelivered_Factors[100]; 

    while(a && !a.eof()){ 
     a.read(reinterpret_cast<char*>(&undelivered_Factors),sizeof(undelivered_Factors)); 
     cout<<undelivered_Factors[i].ID<<"\t"<<undelivered_Factors[i].total_price<<endl; 
     i++; 
    } 
    a.close(); 

但在array.why閱讀和打印保存的因素,它精心讀取並顯示他們的冷杉2後,我應該怎麼辦? ofstream的的

+0

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – Steephen

+1

儘量只調用'閱讀() '一次。 –

回答

1

第二個參數::寫入和讀出::寫的是內存的大小字節,這是正確的(在C \ C++又名「字符」) - 你在一次寫入整個數組。在閱讀過程中,您已經混淆了每個元素和數組處理。你預計讀取整個數組,然後你打印一個值,然後你讀取另一個你沒有在文件中的100個記錄,我猜。只有當你嘗試讀取並且失敗時,eof()纔會發生。如果站在文件末尾,eof()不會被觸發,這就是爲什麼您會打印兩條記錄。

+0

和我應該怎麼做只讀數組中記錄的? – gurekhar

0

您正在完成單個調用中的讀取,因此您的循環只運行一次,因此它只會輸出第一個結構值。改變這樣的while循環:

if(a) 
{ 
    a.read(reinterpret_cast<char*>(&undelivered_Factors),sizeof(undelivered_Factors)); 
} 
for(int i=0; i<100; ++i) 
{ 
    cout<<undelivered_Factors[i].ID<<"\t"<<undelivered_Factors[i].total_price<<endl; 
} 
相關問題