2012-01-11 41 views
3
bool ios::eof () const; 

據庫的,EOF在C++中的IStream

如果eofbit流的誤差標誌已經由 先前I/O操作中設置的函數返回true。當在與流關聯的序列 中達到文件結束時,此標誌由所有標準 輸入操作設置。

我寫了一個程序來運行一些測試:

int main(int argc, char *argv[]) 
{ 
    ifstream ifs(argv[1]); 
    float f; 
    ifs >> f; 

    cout << ifs.eof() << endl; //check if eofbit set 

    ifs.close(); 
} 

我測試了2個文件,testcase1.txt和testcase2.txt。與cat終端生成

testcase1.txt,一個[Ctrl-d]被用來結束輸入:在vim產生

[~/C++ $] cat > testcase1.txt 
1.234[Ctrl-D] 

testcase2.txt,我打開了vim和剛剛輸入1.234,然後保存並退出。

測試結果

測試與testcase1.txt結果是1,這意味着eofbit被設置,

[~/C++ $] ./a.out testcase1.txt 
1 

testcase2.txt測試結果是0

[~/C++ $] ./a.out testcase2.txt 
0 

我打開兩個testcase1.txttestcase2.txtvim,他們看起來完全一樣,那麼爲什麼eofbit沒有設置爲testcase2.txt

+2

難道說VIM附加一個換行符? – 2012-01-11 07:38:13

+0

@Alcott:他們可能看起來一樣,但略有不同。你可以用一個十六進制編輯器來檢查它們的內容是否完全相同......它們可能不是。 – 2012-01-11 07:39:31

+0

@BjörnPollex,我在'vim'中打開這兩個文件,它們都是一行,看起來不像'newline'或'whitespace',只是'1.234'。 – Alcott 2012-01-11 07:44:06

回答

2

正如你在評論看到,有一個新行:

ifstream ifs(argv[1]); 
float f; 
ifs >> f; 
char c; 
ifs.get(c); // this will get '\n' 

即使如此,EOF仍然不會設置....閱讀您再次引用了一段話:

如果eofbit流的錯誤標誌爲 ,則該函數返回true,該值由先前的I/O操作設置。當在與流關聯的序列 中達到文件結束時,此標誌由所有標準 輸入操作設置。

要獲得eof位設置,您必須閱讀PASS eof。如果需要,您可以使用peek()

ifstream ifs(argv[1]); 
float f; 
ifs >> f; 
char c; 
ifs.get(c); // this will get '\n' 
ifs.eof(); // this is false; 
ifs.peek(); 
ifs.eof(); // this is true 

參見:istream::peek curious behavior wrt. EOF

2

vim將在文件末尾添加一個新行。這就是EOF未達到的原因。

+0

附加了一個換行符?這是否意味着,如果我':設置nu',那裏應該是'2'線? – Alcott 2012-01-11 07:47:47

+0

@Alcott no,這意味着EOF在下一行(不在數字所在的行) – 2012-01-11 08:01:38

+0

@Alcott,no。這意味着你在vim中設置了endofline(默認是打開的)。這在文件末尾添加一個NL。做一個':help eol' – 2012-01-11 08:04:55