2011-04-23 37 views
3

我使用開發C++在Windows XP上EOF問題C++

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

int main() 
{ 
    string STRING; 
    ifstream infile; 
    infile.open ("sample.txt"); 
     while(!infile.eof) 
     { 
      getline(infile,STRING); 
      cout<<STRING; 
     } 
    infile.close(); 

    return 0; 
} 

這個代碼提供了以下錯誤

C:\C++\read.cpp: In function `int main()': 

C:\C++\read.cpp:11: error: could not convert `infile.std::basic_ios<_CharT, _Traits>::eof [with _CharT = char, _Traits = std::char_traits<char>]' to `bool' 
C:\C++\read.cpp:11: error: in argument to unary ! 

我不知道這裏有什麼問題,我不能編譯代碼 請幫助

+5

與您的問題沒有直接關係,但Dev-C++確實過時了。嘗試使用[Code :: Blocks](http://www.codeblocks.org/downloads/26)與MingW或[Visual Studio Express](http://www.microsoft.com/express/Downloads/#2010-Visual -CPP)而不是 – 2011-04-23 14:06:44

+0

感謝您的建議@ Firas Assaad,我已經使用visual studio express,但它減慢了我可憐的pc,我會嘗試代碼:: blocks – user721776 2011-04-23 14:15:52

回答

10

如果你改變你的循環來

while(getline(infile,STRING)) 
    { 
    cout<<STRING; 
    } 

你避免兩次讀取的最後一個值(見this SO post)的可能性。

+1

+1。這是迄今爲止唯一正確的答案。 – Nawaz 2011-04-23 14:24:52

+0

如果我使用get()讀取像infile.get()這樣的單個字符,那麼如何在不使用infile.eof()的情況下控制循環呢? – user721776 2011-04-23 14:38:47

+0

@ user721776:只要你將結果賦給一個'int'('std :: istream :: int_type')而不是'char'('std :: istream :: char_type'),那麼在所有合理的平臺上可以可靠地測試'EOF'('std :: istream :: traits_type :: eof()')作爲你的循環條件。 – 2011-04-23 14:48:49

9

std::ifstream::eof是一個返回bool的函數。 Thsu你要稱呼它

infile.eof() 
+2

請不要建議使用'.eof()'作爲循環條件。這幾乎總是不正確的。 – 2011-04-23 14:26:20