2016-10-03 43 views
-1

這是代碼。 它給出如下所示的EXACT輸出意味着它正在讀取文件。 但它也顯示fails,因爲您可以看到它意味着fin.fails()true。 我想知道爲什麼這是真的,雖然我成功地閱讀文件。爲什麼輸入流對象在讀完文件後失敗?

#include<fstream> 
#include<iostream> 
using namespace std; 
int main() 
{ ifstream fin; 
    fin.open("pro.txt"); 
    char ch; 
    int data; 
    while(!fin.eof())//!(fin >> ch).eof() 
    { 
     fin.get(ch); 
     cout<<ch; 
     if(fin.fail()) { 
      cout<<"fails"; 
     break; 
     } 
    } 
    fin.clear(); 
    fin.seekg(0); 
    int pos=(int)fin.tellg(); 
    cout<<"\n this is :"<<pos; 
    fin.close(); 
    return 0; 
} 

Output is : 
this is my name 
fails 
this is 0 

Contents of pro.txt: 
this is my name 

不知道爲什麼會發生這種情況!

+1

[OT]不要使用'eof'作爲循環條件:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – NathanOliver

+0

然後什麼使用 ?以及爲什麼fin.fails爲真 – akitsme

+0

正確的方法是使用讀取操作。 – NathanOliver

回答

0

還沒有找到原因,因爲我相信沒有人願意 但我想通了,讀空格和文件未做fin.fails() = truefin.fails()是真實的。 只是用while(fin.get(ch))代替while(!fin.eof()),並刪除出現在body中的fin.get(ch) - >這就是爲什麼我的輸出在每次閱讀時跳過一個字符的原因..這是我在評論中提到的。

+0

是的,我在評論中也提到了這個,但是你告訴我我錯了。 :smh: –

+0

我沒有那麼說!我知道那是我的錯,'fin >> ch'不管理白色空間嘗試自己 – akitsme

+0

這是你第一次提到空格.... –

0

的問題如下:讀取的最後一個字符的文件與get設置eofbit,所以在你的while條件調用fin.eof()還是你讀裏面的文件的最後一個字符後false循環體。然後在讀取最後一個字符後的迭代過程中,嘗試讀取循環體內的另一個字符,即使沒有可讀的字符。這將設置eofbitfailbit根據specificationget

TL; DR:讀取文件末尾應設置爲failbit

相關問題