ホームページ >バックエンド開発 >C++ >C コードが EOF をチェックするときにテキスト ファイルの最後の行を 2 回読み取るのはなぜですか?

C コードが EOF をチェックするときにテキスト ファイルの最後の行を 2 回読み取るのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-27 15:20:15948ブラウズ

Why Does My C   Code Read the Last Line of a Text File Twice When Checking for EOF?

テキスト ファイルからの EOF 読み取りのトラブルシューティング

ファイルの終わり (EOF) に達するまでテキスト ファイルから読み取る場合、次のことが重要です。入力ストリームの動作を理解して行の重複を避けるため。

C では、 ifstream オブジェクトはテキスト ファイルからの読み取りに使用されます。提供されているコードは、テキスト ファイルから整数を読み取る一般的な方法を示していますが、最後の行が 2 回読み取られるという問題が発生します。

問題の理解

この問題は、eof() 関数がストリームの内部ポインタに基づいて EOF をチェックするために発生します。内部ポインタは、EOF に達したときにファイルの最後の文字の後に配置されます。コードは、整数に遭遇したときに最後の行を 1 回読み取り、ループ内で EOF をチェックするときにもう一度読み取ります。

解決策

これを修正するには、次のことを確認することをお勧めします。ループ内の整数を読み取る前に、EOF を確認します。これにより、最後の整数が 1 回だけ読み取られることが保証されます。

while (!iFile.eof())
{
    if (iFile.peek() != EOF)
    {
        int x;
        iFile >> x;
        cerr << x << endl;
    }
}

ここで、iFile.peek() は、実際には読み取らずにストリーム内の次の文字をチェックします。 EOF でない場合は、整数が読み取られて出力されます。

代替アプローチ

さらに、getline 関数を使用してコードを書き換えて、整数から行全体を読み取ることもできます。ファイルを開き、整数を手動で解析します。このアプローチにより、EOF の問題が完全に回避されます。

ifstream iFile("input.txt");

while (getline(iFile, line))
{
    istringstream ss(line);
    int x;
    ss >> x;
    cerr << x << endl;
}

以上がC コードが EOF をチェックするときにテキスト ファイルの最後の行を 2 回読み取るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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