提供されたコード スニペットは std:: を利用します。 fstream クラスを使用して、「ex.txt」という名前のファイルから文字を読み取ります。 eof() 関数を使用してファイルの終わりをチェックします。ただし、このコードは、eof() の使用時に余分な文字を読み取って -1 を表示するという予期しない動作を示します。これにより、関数の機能を理解する際に混乱が生じます。
std::fstream の eof() 関数は、ファイルの終わりに到達したかどうかを判断します。ただし、EOF フラグが設定されるのは、ファイルの末尾を超えてを読み取ろうとした後のみであることを理解することが重要です。
この例では、ファイル " ex.txt" には "abc" という文字が含まれており、最初のループでは inf.get() を使用して各文字を読み取ります。ファイルの終わりに到達すると、eof() は true を返し、ループが終了します。ただし、get() はファイルの終わりに達すると EOF を返すため、余分な文字 (-1) が表示されます。この動作は、読み取り操作の終了を示すための仕様です。
2 番目のループは、ストリーム演算子 >> を利用します。この演算子はストリームへの参照を返し、ストリームに対して次の読み取り操作を実行できるようにします。読み取りが成功すると、ストリームは「良好」とみなされ、ループが続行されます。それ以外の場合、ストリームは「不良」になり、ループが終了します。
eof() を使用すると、よくエラーが発生します:
while (!inf.eof()) { // EOF is false at this point inf >> x; // Read fails, EOF becomes true // Use x, which was not set due to failed read. }
このシナリオでは、inf >> を使用した読み取り操作が原因で問題が発生します。 x は、ファイルの終わり条件に遭遇した後、EOF フラグを設定します。その結果、その後の x の使用は信頼できなくなります。
eof() の微妙な点を理解すると、これらのよくある落とし穴を回避できます。ストリーム演算子 >> の使用while ループ内の eof() の代わりに、ファイルの終わりの条件をチェックするためのより堅牢な方法が提供されます。
以上が`std::fstream::eof()` が予期しない結果を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。