2014-01-12 49 views
1

我有這樣的代碼:ifstream的EOF函數(C++)

string a = "D:\\Users\\user-pc\\Desktop\\testing\\a.txt"; 

ifstream f; 
    /*edit*/ string line; 

    /*edit*/ getline(f, line); 
f.open(a); 
if (f.eof()) 
    cout << "ended"; 
else 
    cout << "nope" 

和文件 'A.TXT' 它有什麼也沒有。

輸出是nope,一直沒有。我不明白..我用錯了嗎?

編輯:仍然.EOF()不工作

+0

可能的[C++ eof()問題重複 - 永遠不會返回true?](http://stackoverflow.com/questions/3842030/c-eof-problem-never-returns-true) – Mgetz

+1

'此函數只報告流狀態由最近的I/O操作設置,它不檢查關聯的數據源。換句話說,你需要先嚐試閱讀,然後才能評估狀態。 – Till

+0

爲了詳細說明其他的註釋:你必須做一個像'f.get()'的操作,然後檢查'f.eof()' - 那麼它就是'true'。但是,如果文件不是空的,第一個'char'就會被拋棄。要做你真正打算的,你可以使用'if((f.rdbuf() - > in_avail())== 0)'。所以你可以真正檢查文件中有多少個字符而不用提取它們。 – mb84

回答

4

std::basic_istream<...>::eof()僅在最近的提取設置相應的位流的狀態返回true。當構建文件流時,其流狀態始終爲std::ios_base::goodbit

另一種方法是檢查下一個可用的字符是EOF字符:

if (f.peek() == std::char_traits<char>::eof()) 
+0

你的方法正在工作!謝謝! 看編輯 - 仍然不好(eof) – user2410243

+0

@ user2410243這是因爲您在打開文件之前執行了提取操作*。 – 0x499602D2

+0

@ user2410243換句話說,在'getline(f,line);'之前執行'f.open(a);'。 – 0x499602D2

1

eofbit錯誤狀態標誌只能設置一次讀嘗試讀取過去的文件的末尾。