2015-10-16 30 views
1

我試圖從文件中的文本閱讀,這是我在做什麼:爲什麼我在文件中讀到最後一個字兩次?

int main(int argc, char* argv[]) 
{ 

ifstream inFile; 
inFile.open(argv[1]); 

string item; 

while(inFile.good()) 
{ 
    inFile >> item; 
    cout << item << " " << endl; 
} 

出於某種原因,它會讀取文件中的最後一個字的兩倍。我試着用count變量來跟蹤它進入while循環的次數,它總是比文件中的總行數多一倍。我認爲這是因爲inFile.good()聲明不會很快返回false。如果解決它,該怎麼辦?

+1

你應該添加的文件contet太(如果它不是太長) – Arne

+1

該文件可能是「好」,但接下來的'INFILE >> item'仍然可能會失敗,你的輸出也無妨。 –

回答

2

你是不是測試,如果

inFile >> item; 

正在取得成功 - 在已經讀取文件的最後一個字還是有換行符或其他一些空白點 - 所以你沒有達到文件結尾,但另一方面也沒有更多的單詞需要讀取,因此上次讀取失敗,但是您沒有檢測到它。

您可以測試>>作爲布爾表達式的成功,這應該工作;

if (inFile >> item) 
    cout << item << " " << endl; 
+0

那麼我能做些什麼來抓住它?我嘗試設置'inFile >>項目;'作爲參數,但現在它跳過第一行,仍然讀取最後一行兩次。 –

+0

它會返回一個布爾值true或false,只是測試一個if-statment – Soren

1

上次讀取失敗,但您沒有抓住它。該變量僅保留之前的值。

你的循環更改爲:

while(inFile >> item) 
{ 
    cout << item << " " << endl; 
} 
+0

我試過了。現在它跳過第一行並仍然讀取最後一行兩次。 –

0

其他人表現出你應該寫的代碼,所以我只是要解釋爲什麼你的代碼沒有工作。

istream.good(),的確, 「沒有返回很快假的。」在閱讀文件中的最後一項之後,它仍然是真的。當您試圖讀取文件的結尾之後的一個項目時,它只會變成錯誤。

全部詢問「我已達到文件末尾?」的各種方式?在C和C++中有相同的語義。這是因爲底層操作系統原語read無法同時返回數據和EOF信號。

相關問題