2011-10-04 81 views
1

考慮以下幾點:爲什麼我的代碼從輸入文件讀取一行。 C++不知道

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() 
{ 
int score; 
char grade; 
ofstream myfileo; 
ifstream myfilei; 
myfilei.open ("example.txt"); 
while (!myfilei.eof()) { 
    myfilei >> score; 


cout << "Enter your score:" << endl; 
if (score >= 90) 
    grade = 'A'; 
else if (score >= 80) 
    grade = 'B'; 
else if (score >= 70) 
    grade = 'C'; 
else if (score >= 60) 
    grade = 'D'; 
else 
    grade = 'F'; 
cout << "Your grade was a" << grade << endl; 
switch (grade) { 
    case 'A': case 'B': 
     cout << "Good job" << endl; 
     break; 
    case 'C': 
     cout << "Fair job" << endl; 
     break; 
    case 'F': case 'D': 
     cout << "Failure" << endl; 
     break; 
     default: 
     cout << "invalid" << endl; 
} 
} 
myfilei.close(); 
myfileo.close(); 
return 0; 
system ("PAUSE"); 

}

此代碼僅讀取從examples.txt文件的最後一行是完全格式化這樣的 「成績」 的:

95 
21 
41 
78 
91 

爲什麼上面的代碼沒有讀入並輸出所有行?


編輯現在它只是一個死循環

+0

當然,它只做最後一行,循環讀取直到文件結束。 – Porco

+0

@Porco:你應該讓這個評論成爲答案! – Skizz

+0

可能重複[eof()壞習慣?](http://stackoverflow.com/questions/5837639/eof-bad-practice) –

回答

3

在while循環你不斷改寫比分「」所以它會永遠只能是在文本文件中的最後一個值。如果您需要從文件中獲取多個值,則最好使用數組(或類似)並將其添加到該文件中。

+0

不需要數組,只需擴展閱讀循環,以包括一切直到'close'。 – Skizz

+0

實際上,他讀取第一個循環中最後一個元素的一個元素;如果第一個循環實際上與他想要做的相對應,那麼它應該是'while(myfilei >> score)...'。 (把'score'的所有處理放在這個循環中可能會完全解決這個問題。) –

+0

對於這兩點都是正確的! –

1
while (!myfilei.eof()) { 
    myfilei >> score; 
} 

這段代碼逐行讀入行,然後在到達文件末尾時繼續。這就是爲什麼你只看到它處理最後一行。
任何你想要執行的代碼每行應該是這個循環裏面的。例如,一切達

myfilei.close(); 

此外,由於所有代碼在文件中每行執行一次,輸出不需要在循環中。

//while (!myfilei.eof()) { 
    myfileo << grade << " " << score << endl; 
//} 

[編輯]
現在無限重複的問題是,因爲myfilei.eof()總是返回false,如果第一次出現另一個錯誤。 (就像在我的測試案例中,文件無法打開。)基本經驗法則:從不檢查.eof()。這是大多數人做的事:

while (myfilei >> score) { 
    //code for this score 
} 
//end of file or error 

這種嘗試從myfilei讀入score,並繼續循環,同時它成功。如果因爲任何原因而失敗,它會跳出循環。

+0

上述循環將永遠不會執行。當他到達這裏時,情況是錯誤的。 –

+0

哇,我複製了錯誤的循環。這是怎麼發生的? –

+0

也沒有工作 –

相關問題