ホームページ > バックエンド開発 > C++ > C でファイル ストリームから読み取るときにファイルの終わりを正しくテストする方法

C でファイル ストリームから読み取るときにファイルの終わりを正しくテストする方法

Linda Hamilton
リリース: 2024-12-21 15:33:10
オリジナル
695 人が閲覧しました

How to Correctly Test for End-of-File When Reading from a File Stream in C  ?

ストリーム入力状態のテストと将来の成功

ストリームを使用して入力を読み取る場合、ストリーム状態のテストと予測の違いを理解することが重要です

問題: 最後の行の読み取りTwice

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}
ログイン後にコピー

このコードでは、f.good() が getline() が成功するかどうかではなく、現在のストリームの状態をテストするため、最後の行が 2 回読み取られます。 getline() が EOF に達すると、f は「良好な」状態を維持するため、最後の行が読み取られた後でもループは継続します。

解決策: 操作後のテスト ストリーム

代わりに、入力操作を実行した後にストリームの状態を確認します:

ifstream f("x.txt");
string line;
while (getline(f, line)) {
  // Use line here.
}
ログイン後にコピー

代替eof() の使用

ループ条件で eof() を使用することは推奨されませんが、!f.eof() を使用した同等の解決策は次のとおりです。

ifstream f("x.txt");
string line;
while (!f.eof()) {
  if (getline(f, line)) {
    // Use line here.
  } else {
    break;
  }
}
ログイン後にコピー

すべての行の範囲ベースのループ

すべての行を読み取り、処理するには、範囲ベースのループ:

ifstream f("x.txt");
for (std::string line; getline(f, line);) {
  process(line);
}
ログイン後にコピー

Good とストリーム状態

f.good() の名前が間違っていることに注意してください。これはストリームの「良好さ」を実際に示すものではなく、ストリームが「失敗」または「不良」状態にない場合に true を返します。入力操作を実行した後は、必ずストリーム自体をテストして (つまり、反転した失敗状態を確認して)、成功を確認してください。

以上がC でファイル ストリームから読み取るときにファイルの終わりを正しくテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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