ホームページ > バックエンド開発 > C++ > C で `fstream` を使用するときに最後の行を 2 回読み取らないようにするにはどうすればよいですか?

C で `fstream` を使用するときに最後の行を 2 回読み取らないようにするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-11 02:32:13
オリジナル
677 人が閲覧しました

How Can I Prevent Reading the Last Line Twice When Using `fstream` in C  ?

fstream ストリームのテスト: Good() および eof() による最後の行の 2 回読み取り問題の回避

ファイル入力操作に fstream を使用すると、多くの場合、ストリームの状態のチェックが必要になります。読書をいつやめるかを決定します。ただし、特定の状態フラグを使用すると、最後の行が 2 回読み取られるなど、予期しない問題が発生する可能性があります。この記事では、根本的な原因を調査し、この問題を回避するための解決策を提供します。

最後の行が 2 回読み取られる理由

この問題は、good() または ! を使用するときに発生します。 getline() を使用してファイルから行を読み取る while ループ内の eof() 条件。これが起こる理由は次のとおりです:

  • good() は stream.operator bool() と同等ではありません: その名前にもかかわらず、good() はストリームが良い状態です。代わりに、getline() 操作の後にストリームとバッファリングされた文字の状態をテストします。どちらかが false の場合、good() は false を返します。これにより、最後の行の後に入力がない場合でも getline() が成功する可能性があるため、最後の行が 2 回読み取られる可能性があります。

修正: getline() を使用してください。行の読み取りが成功したかどうかを確認するための戻り値:

while (getline(stream, line)) {
  // Use line here.
}
ログイン後にコピー
  • eof() は現在の値を反映します。 state: eof() は、ストリームがファイルの終わり (EOF) 位置に到達したかどうかをチェックします。ただし、EOF に達したからといって、必ずしも最後の getline() オペレーションが失敗したことや、ファイルの終わりを示しているわけではありません。

修正: getline() オペレーションが正しいかどうかを確認してください。 EOF をチェックする前に成功しました:

if (getline(stream, line)) {
  // Use line here.
} else if (stream.eof()) {
  // Handle end-of-file condition.
} else {
  // Handle error condition.
}
ログイン後にコピー

ベスト実践方法

これらの問題を回避し、ファイル行を効率的に処理するには、次の点を考慮してください。

  • >> を使用します。演算子: ストリーム用にオーバーロードされたこの演算子は、入力操作の成功または失敗をチェックできます。例:
if (stream >> foo >> bar) {
  // Use foo and bar here.
} else {
  // Handle error condition.
}
ログイン後にコピー
  • 明示的な for ループを使用します: これにより、ストリームの状態チェックが不要になります:
for (string line; getline(stream, line);) {
  // Use line here.
}
ログイン後にコピー

これらのガイドラインに従うことで、最後の行を意図せずに 2 回読み込むことを回避し、信頼性の高いファイル入力処理を保証できます。 fstream.

以上がC で `fstream` を使用するときに最後の行を 2 回読み取らないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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