最近、fstream :: eof()を使用することで問題が発生しました。私はここから次の行を読みました:
関数eof()は、関連付けられた入力ファイルの終わりに達した場合はtrueを返し、それ以外の場合はfalseを返します。
そして(誤って)これは、fstream :: read()を使用してファイルの終わりを超えて読み取った場合、関数eof()が教えてくれることを意味すると想定していました。だから私はこのようなことをしました(非常に一般化されています):
for(int i = 0; i < max && !file.eof(); i++)
{
file.read(mything, sizeof(mything));
}
この問題は、上記のリンク先のページで後で説明されていることが原因で発生しました(誤解を招く最初の段落のおかげで、最初は読むことができませんでした)。
逆に、最後のトークンの後に空白がある場合、ストリームはEOF状態にはなりませんが、別のトークンを読み取ろうとすると失敗します。したがって、EOFフラグは、EOFまですべてのストリームコンテンツを読み取ることを目的としたループのテストとして使用することはできません。代わりに、読み取りを試みた後、失敗状態をチェックする必要があります。
そこで変更を加えたところ、ループはfile.eof()ではなくfile.fail()をチェックし、eof()がどのように機能するかを理解しました。私の質問は、なぜそれがそのように機能するのかということです。これが望ましい状況はありますか?EOFを通過すると、EOFを通過し、eof()はtrueを返すはずです。
更新 回答ありがとうございます、私はそれを持っていると思います。私が実行している操作はread()だけで、すぐにfail()をチェックするので、大丈夫だと思います。さて、私の質問は、eof()を何に使用するのかということです。