2011-11-07 105 views
0

我想通過下面的代碼讀取文件我正在閱讀文件,但在閱讀時,它正在閱讀最後一個字符一次?

void main() 
{ 
    int i=0; 
    ifstream fout1 ("Aj.txt",ios::binary); 
    if (fout1.is_open()) 
    { 
     while(fout1) 
     { 
     i++; 
     fout1.get(ch1); 
     cout<<ch1; 
     } 
     cout<<i; 
     fout1.close(); 
    } 
    else 
    { 
     cout << "Unable to open file"; 
    } 
    return 0; 
} 

這裏的代碼讀取整個文件,但它進入一週額外的時間,即如果在文件中4character然後在循環就會重複5次。如何糾正或克服它。

+0

這是否編譯? –

+0

void並返回0; – Furqan

+1

while(fout1.get(ch1)){cout << ch1; ++ i} – jrok

回答

3

該代碼讀取,直到eof標誌設置,但eof標誌未設置直到讀實際上失敗。這意味着當fout1.get(ch1)讀取最後一個字符時,eof而不是設置尚未。所以它顯示,並檢查fout這仍然是好的,所以它重新進入循環。然後fout1.get(ch1)因爲eof而失敗,並且它再次顯示以前的值ch1。編寫該循環的正確方法是:

while(fout1.get(ch1)) { //false when it can't read any more characters 
    i++; 
    cout<<ch1; 
} 
cout<<i; 
fout1.close(); 
2

讀取第4個字符後,數據流仍處於良好狀態,因此它會嘗試讀取第5個字符,並在那時遇到文件結尾。撥打get後,您應該檢查流狀態。例如:

while(fout1.get(ch1)) 
{ 
    cout << ch1; 
    ++i; 
} 
0

如果您不熟悉iostream,那麼這是一個容易犯的錯誤。 stream.eof()將是false如果您只有讀取文件中的最後一個字符。只有當您嘗試讀取過去文件末尾才成爲真。你需要一個看起來像這樣的內部循環:

for (;;) 
{ 
    fout1.get(ch1); 
    if (!fout1) break; 
    cout << ch1; 
    i++; 
}