web-dev-qa-db-ja.com

ifstream:正常に開かれたかどうかを確認します

同僚がこのコードを教えてくれました:

std::ifstream stream(filename.c_str());
if (!stream)
{
    throw std::runtime_error("..");
}

間違っているでしょう。彼は、オープンが成功した場合、ifstreamは0と評価されると述べました。私のコードは機能しますが、ドキュメントを見つけたかったのですが、開くことが成功したかどうかを確認する方法が記載されている場所がわかりませんでした。私にそれを指摘してもらえますか?

40
Philipp

_operator!_ is overloaded for _std::ifstream_の場合、canでこれを実行できます。

しかし、私の意見では、これは(標準委員会による)オペレーターの過負荷の恐ろしい乱用です。 if (stream.fail())を実行するだけで、何をチェックするかがより明確になります。

49

ios :: exceptions() 関数を適切なビットマスクで呼び出して、特定のストリームにeof/fail/badのいずれかで例外をスローさせることができます。したがって、上記の最初の質問の例を次のように書き換えることができます。

std::ifstream stream;
stream.exceptions(std::ios::failbit | std::ios::badbit);
stream.open(filename.c_str());

ここで、failbitまたはbadbitが設定されると、ストリームは例外をスローします。たとえば、 ifstream :: open() が失敗した場合、failbitが設定され、例外がスローされます。もちろん、これらのビットのいずれかがストリームに設定されると、後で例外がスローされるため、この書き換えは最初の例とまったく同じではありません。電話できます

stream.exceptions(std::ios::goodbit);

ストリームのすべての例外をキャンセルし、エラーのチェックに戻ります。

11
Greg Satir

is_open() を使用して、機能しているかどうかを確認することもできますが、!許可されます(ゼロのチェックは行われません。これは特別な !のオーバーロード

編集:
興味がない-なぜこれが例外をスローしないのですか?
例外が発生する前にストリームが導入されただけですか
または私たちは古いC++のことに夢中になっています-それは例外であるほど例外的ではないエラーにすぎません。

10
Martin Beckett

あなたの同僚は間違っていますです。おそらく彼はあなたがCを書いていないことを忘れているのかもしれません。

コードはその場にあります。 正確にストリームの状態をチェックする方法です。