2017-03-29 10 views
2

私は現在、C++ Primer 5th editionからC++を学んでいます。一見競合する情報のためにストリームの状態をチェックするメソッドの動作について混乱しています。 badbitfailbit、またはeofbitのいずれかが設定されている場合は、312ページのそれはC++ストリームのeof()、fail()、bad()、およびgood()の違いは何ですか?

を述べ、そのストリームが失敗する評価される条件 。非常に次のページで

、それは流れの中failbitまたはbadbit

ことをコードに設定されている場合s.fail()

真であると述べています条件としてストリームを使用するときに実行されるのは、呼び出しに相当する です!fail()

fail()を使用する任意の式は唯一、badbitの全てと同等の約failbitbadbit(それらがfail()の値を構成するものですので)、まだ!fail()を知っている必要がありますので、これは意味がありません。 failbit、およびeofbitがfalseです。

これらの見かけ上矛盾する声明はどのように組み合わされますか?

+0

http://en.cppreference.com/w/cpp/io/ios_base/iostateを参照してください。それはトピックの優れた概要を提供します。 –

+0

"条件は!fail()を呼び出すのと同じです。"そうではありません。この本は別に言いましたか? –

+0

@ n.m。私は[C++ Primer](https://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113)を直接引用しています。これは[this](http://stackoverflow.com/a/388282/2985951)で非常にupvoted答えが推奨されます。 – john01dav

答えて

2

2番目と3番目のステートメントは正しく、C++標準と合致しています。最初のものは単に間違いです。 failでもoperator boolでもoperator !もストリームの状態を考慮していません。 goodeofのみ

イベントの通常の流れでは、ストリームの末尾を読み取ろうとするとeofbitfailbitの両方が設定されます。これは、このミスを簡単にする理由の1つです。

+0

'operator bool'がeofをチェックしない場合、Linuxシステムでctrl + dを入力すると、[this](https://pastebin.com/gRERFBiS)プログラムがwhileループを終了するように見えるのはなぜですか? ctrl + dもstdinを無効にしますか? – john01dav

+0

それ以上の文字を抽出しない場合は、 'failbit'を設定します。 http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2を参照してください –

+0

私の答えの2番目の段落を見てください - EOFの後に '' 'を使って読み込みを試みると、ストリームが失敗する* * EOFなので、booleanチェックはfalseを返します。 – hobbs

関連する問題