2017-05-01 11 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ですが、最後にの後にeofbitを設定しないのはなぜですか? eofbitfailbitについて

答えて

3

ファイルの終わりに達するにはeofbitを設定します。しかし、ファイル末尾に達する操作 は、 が失敗する(したがって、eofbitとfailbitの両方を設定する)場合、フェイルビットを設定することもできることに注意してください。 get()について

は、1つの文字を読み込み、利用可能な場合はそれを返します。それ以外の場合は、 Traits :: eof()を返し、failbitとeofbitを設定します。

Ungetはeofbitをクリアしますが、failbitで何もできないため、失敗します。その後のgetへの呼び出しは、failbitが設定されているために失敗し、次の文字を確認しないため、eofbitを設定できません。

関連する問題