同僚がこのコードを教えてくれました:
std::ifstream stream(filename.c_str());
if (!stream)
{
throw std::runtime_error("..");
}
間違っているでしょう。彼は、オープンが成功した場合、ifstream
は0と評価されると述べました。私のコードは機能しますが、ドキュメントを見つけたかったのですが、開くことが成功したかどうかを確認する方法が記載されている場所がわかりませんでした。私にそれを指摘してもらえますか?
_operator!
_ is overloaded for _std::ifstream
_の場合、canでこれを実行できます。
しかし、私の意見では、これは(標準委員会による)オペレーターの過負荷の恐ろしい乱用です。 if (stream.fail())
を実行するだけで、何をチェックするかがより明確になります。
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);
ストリームのすべての例外をキャンセルし、エラーのチェックに戻ります。
あなたの同僚は間違っていますです。おそらく彼はあなたがCを書いていないことを忘れているのかもしれません。
コードはその場にあります。 正確にストリームの状態をチェックする方法です。