ホームページ > バックエンド開発 > C++ > 「good()」または「!eof()」を使用すると、ファイルの最後の行が 2 回読み取られるのはなぜですか?

「good()」または「!eof()」を使用すると、ファイルの最後の行が 2 回読み取られるのはなぜですか?

Patricia Arquette
リリース: 2024-12-16 03:27:11
オリジナル
865 人が閲覧しました

Why Does Using `good()` or `!eof()` Read the Last Line of a File Twice?

ストリーム条件のテスト: Good() または !eof() を使用すると最後の行が 2 回読み取られる理由

テキスト ファイルを読み取ろうとしたときifstream を使用して 1 行ずつ実行すると、ループ内で f.good() または !f.eof() を利用すると、最後の行が 2 回読み取られる可能性があります。この動作の背後にある理由を詳しく調べ、別の解決策を検討してみましょう。

ストリーム状態関数について

good()、eof()、およびfail()はストリーム状態です。入力ストリームの現在の状態を示す関数。ただし、将来の入力操作の成功または失敗を予測するものではありません。

最後の行を 2 回読み取る理由

この問題は、good() と eof( ) は、必ずしも最後の入力操作の結果を反映するわけではありません。たとえば、!f.eof() は、前の getline() が成功したことを保証しません。逆に、EOF にないことは、最後の入力操作が失敗したことを意味するものではありません。

代替解決策: 入力操作後のストリーム状態の確認

行を正しく読み取り、処理するには、入力操作の実行後にストリームの状態を確認することが重要です:

if (getline(f, line)) {
  // Use line here
} else {
  // Handle error or end of file
}
ログイン後にコピー

代替解決策: ループによる反復

もう 1 つの洗練された解決策は、getline() が失敗するまで反復するループを使用することです。 >

for (string line; getline(f, line);) {
  // Use line here
}
ログイン後にコピー
最後に、good() は誤った呼び名であることに注意することが重要です。これは、ストリーム自体をテストすることと同等ではありません。 Good() に依存する代わりに、上記で説明した手法を使用することをお勧めします。

以上が「good()」または「!eof()」を使用すると、ファイルの最後の行が 2 回読み取られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート