web-dev-qa-db-ja.com

ifstream :: is_open vs ifstream :: fail?

サヴィッチの定理を読むC++での問題解決std::ifstream::failは、ファイルが正しく開かれたかどうかを確認するための例として示されています(ifstreamまたはofstream)。

私が最初に示したものなので、以前に使用しました。std::ifstream::is_open同じチェックを実行します。

「より良い」実践はどれですか?

または、どちらかを開こうとした直後に呼び出された場合、実際的な違いはありませんか?

18
OJFord

前書き

_std::ifstream::fail_には_std::ifstream::is_open_のチェックが含まれますが、_std::ifstream::is_open_はファイルへのハンドルを作成できたかどうかのみをチェックします。


説明

_std::ifstream::fail_がtrue;を返した場合でも、_std::ifstream::is_open_はtrueを返すことができます。それらは相互に排他的ではありません。

_.fail_は、ストリームの全体的な "health"をチェックします。これには、ストリームが現在失敗状態に入っていることのチェックなどが含まれます無効な値を読み取ろうとするのに対し、_.is_open_はストリームが現在ファイルに添付されているかどうかのみをチェックしますが、_.is_open_はストリームが失敗状態かどうか。


より良い実践は何ですか?

これは確かにあなたが達成しようとしていることに依存します。

通常は、 explicit operator bool () を使用して、ストリームの読み取り/書き込みの準備ができているかどうかを確認することをお勧めします。これには、ストリームの全体的な状態のチェックが含まれます。

_some_stream_で別の読み取り/書き込み操作を行うことはできますか?

_if (some_stream) {
  // stream is alive and well
} else {
  // something is wrong
}
_

一部のfstreamが実際にファイルに添付されているかどうかを明示的に確認したい場合は、_is_open_を使用し、全体的な状態を確認したい場合は、 _.fail_を使用するか、ストリームがboolに変換可能であるという事実に依存します。

23

代わりにbool変換演算子を使用してください!

ifstream i("test.txt");
if (i) {
    //success
}

またはそれ以上:

ifstream i("test.txt");
if (!i) {
    //failure, handle error
}
7
Csq