ホームページ >バックエンド開発 >C++ >`ifstream::eof()` が `get()` と抽出演算子 (`>>`) で異なる動作をするのはなぜですか?

`ifstream::eof()` が `get()` と抽出演算子 (`>>`) で異なる動作をするのはなぜですか?

DDD
DDDオリジナル
2024-12-02 06:36:11932ブラウズ

Why Does `ifstream::eof()` Behave Differently with `get()` and the Extraction Operator (`>>`)?
>`)? " />

ifstream の eof() 関数の詳細

提供されたコード スニペットに示されているように、ifstream の eof() 関数の動作を理解するのは難しい場合があります。

</p>
<h1>を含む<iostream></h1>
<h1>include <fstream></h1>
<p>int main() {</p>
<pre class="brush:php;toolbar:false">std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
    std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
    std::cout << c << "\n";
}
return 0;

}

解説を詳しく見ていきましょう提供:

EOF が実際に設定されるとき

eof() 関数は、読み取り操作がファイルの末尾を超えてデータにアクセスしようとしたときを検出します。

  • 内容が「abc」のファイルがあり、3 文字を読み取る場合、eof() は次のようになります。 false。
  • しかし、4 番目の文字を読み取ろうとすると、eof() は true になり、ファイルの終わりに達したことを示します。

この動作の理由ファイル サイズの概念がテキストほど単純ではないパイプやソケットなど、さまざまなデバイスとの互換性を確保するためです。 file.

get() と >> の魔法を明らかにする

コード スニペット内の 2 つのループは、ファイルの内容を読み取るために異なるアプローチを使用します。

  • 最初のループでは、inf.get() を使用して一度に 1 文字ずつ文字を取得します。ファイルの終わりに到達すると、get() は -1 を返します。
  • 2 番目のループは inf >> を使用します。 c は、読み取り試行と割り当てを 1 つの操作で組み合わせたものです。このアプローチでは、c をファイルから読み取られた値に設定しますが、読み取りが失敗した場合 (ファイルの終わりに達したため)、 false と評価され、ループが終了します。

これは、なぜ最初のループは余分な文字を読み取り、-1 を表示しますが、2 番目のループは正しい出力を返します。ループの最後を超えて読み取ろうとする前にループを終了します。 file.

-1 の危険を回避する

ファイルの終わりを識別するためにマジックナンバー -1 に頼ることを避けるために、std を使用することをお勧めします。 :char_traits::eof() または std::istream::traits_type::eof()代わりに。

以上が`ifstream::eof()` が `get()` と抽出演算子 (`>>`) で異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。