2012-04-08 88 views
0
文件

可能重複:
Reading from text file until EOF repeats last line
c++ EOF running one too many times?爲什麼C++ ifstream的讀取與重複記錄

我寫一個簡單的C++代碼讀取和寫入二進制文件,但我發現ifstream會兩次讀取記錄。我不知道這是如何發生,但我嘗試編譯在Windows和Linux與mingw32的代碼,相同的情況下

ofstream outfile; 
int data[5]; 
outfile.open("abc.out", ios::out | ios::trunc | ios::binary); 
data[0] = data[1] = 1; 
data[2] = data[3] = 2; 
data[4] = -1; 
cout << "ORIGINAL DATA:" << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl << endl; 
outfile.write((char *)&data[0], 5*sizeof(int)); 
outfile.close();  


ifstream infile; 
infile.open("abc.out", ios::in | ios::binary); 
data[0] = data[1] = data[2] = data[3] = data[4] = 0; 
while (!infile.eof()) 
{ 
    infile.read((char *)&data[0], 5*sizeof(int)); 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 
} 

這裏是輸出

原始數據:1 1 2 2 -1

1 1 2 2 -1

1 1 2 2 -1

+0

'infile.eof()'只*後返回true *無法讀取,因此該循環運行一次太多。 – 2012-04-08 07:06:02

+0

謝謝博佩爾鬆,但我還是不知道如何解決這個問題。讀「從文本文件中讀取直到EOF重複最後一行」,我嘗試下面的代碼 而(真){ ... 如果(infile.eof())破; } 但仍然無法正常工作 – user1285419 2012-04-08 07:09:29

+1

@user - 您可以測試EOF,或檢查read'的'的返回值,決定寫信給COUT之前(暗示,暗示!)。 – 2012-04-08 07:13:50

回答

2

千萬不要使用.eof().good()作爲循環條件。它幾乎總是產生bug的代碼(因爲它在這種情況下一樣)。

用於讀取數據的慣用模式是C++是這樣的:

while (infile.read((char *)&data[0], 5*sizeof(int))) 
{ 
    cout << data[0] << " " << data[1] << " " << data[2] << " " 
     << data[3] << " " << data[4] << endl; 
} 
2

正如@BoPersson已經指出的那樣,該問題使用while (!infile.eof()),這是幾乎總是錯誤莖。相反,你想檢查讀取數據的結果。第一個近似會是這個樣子:

// prefer 1-step initialization -- supply parameters to ctor. 
ifstream infile("abc.out", ios::in | ios::binary); 

while (infile.read((char *)&data[0], 5*sizeof(int)) 
    cout << data[0] << " " 
     << data[1] << " " 
     << data[2] << " " 
     << data[3] << " " 
     << data[4] << endl; 
+0

謝謝了很多傑裏棺材。有用 :) – user1285419 2012-04-08 07:24:42

1

由於流進當讀取失敗和流可以被看作是一個虛假的布爾,由於讀取返回流istelf, 你可以這樣做

while(infile.read((char *)&data[0], 5*sizeof(int))) 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 

因此只留下讀取失敗的循環。