ホームページ >バックエンド開発 >C++ >C ファイル入力ストリームを使用するときに行の二重読み取りを回避するにはどうすればよいですか?

C ファイル入力ストリームを使用するときに行の二重読み取りを回避するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 13:28:16276ブラウズ

How Can I Avoid Double-Reading Lines When Using C   File Input Streams?

ファイル入力のストリーム状態のテスト: 二重読み取りの回避

ファイルからデータを読み取るときは、同じ行を複数回読み取ることを避けることが重要です回。ただし、読み取り前に Good() や !eof() などのストリームの状態をチェックすると、予期しない動作が発生する可能性があります。

次のコードを検討してください。

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}

このコードは、すべての行を読み取ることを目的としています。ファイルから最後に到達するまで。ただし、最後の行は 2 回読み込まれます。その理由を理解するには、ストリーム状態フラグの内部を詳しく調べる必要があります。

ストリーム状態フラグ

good()、eof()、fail()、およびbad() は、入力ストリームの現在のステータスを示すストリーム状態フラグです。通常、good() フラグは、ストリームが今後の読み取りに対して有効な状態にあるかどうかを示すことが期待されますが、これは厳密には正確ではありません。これは、エラーまたはファイル終了条件がないこととしてより正確に説明されます。

good() および !eof() の問題

ストリームをチェックするとき読み取りの前に .good() または !stream.eof() を実行すると、次の読み取り操作が成功するかどうかをストリームに問い合わせることになりません。現在の状態をクエリしているだけです。

たとえば、ファイルから最後の行が読み取られると、eof() フラグが設定されます。ただし、good() フラグは依然として true である可能性があり、最後の読み取り中にエラーが発生しなかったことを示します。

解決策

二重読み取りを回避するには、正しいアプローチは次のとおりです。読み取り操作後にストリームをテストします:

// Read all lines from a file
for (std::string line; getline(f, line);) {
  process(line);
}

// Read an integer and store it in foo
int foo;
if (f >> foo) {
  use(foo);
} else {
  handle_error();
}

このアプローチにより、ストリームから正常に読み取られたデータのみが処理されます。ファイル。

以上がC ファイル入力ストリームを使用するときに行の二重読み取りを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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