2017-05-01 31 views
1

函數std::get()通常在文件結束時設置eofbit。由於C++ 11 std::unget()首先清除此位,然後程序取消最後一個字符的讀取。 讓我感到困擾的是,在我到達eof後,unget()似乎不適合我,它只是清除了一點,但實際上並沒有取消任何東西。對get()的任何後續調用甚至不會再次設置eofbit。 這是故意的,我錯過了文檔中的某些東西嗎?C++ get()未設置eof

gcc版本6.3.1,-std = C++ 11

#include <iostream> 
using namespace std; 

int main() 
{ 
    while (!cin . eof()) 
     cout << " " << cin . get() << " "; 
    cout << "end" << endl; 
    cout << cin . eof() << endl; 
    cout << (bool)cin . unget() << endl; 
    cout << cin . eof() << endl; 
    cout << cin . get() << endl; 
    cout << cin . eof() << endl; 
    return 0; 
} 

例如輸入foobar

例如輸出

102 111 111 98 97 114 10 -1 end 
1 
0 
0 
-1 
0 

真正困擾我的是不是,它使得回eof爲-1,但爲什麼不在最後的get()後面設置eofbit

回答

3

關於eofbitfailbit

車行至檔案結尾設置eofbit。但是請注意,到達文件結束的操作 也可能會設置失敗位,如果這使得它們失敗(因此設置eofbit和failbit) 。

關於get()

讀取一個字符,如果可用返回。否則,返回 Traits :: eof()並設置failbit和eofbit。

Unget清除eofbit,但不能對failbit做任何事情,從而失敗。由於設置了failbit,後續對get的呼叫失敗,並且不檢查下一個字符,因爲它們不能設置eofbit