Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod C Saya Membaca Baris Terakhir Fail Teks Dua Kali Apabila Menyemak EOF?

Mengapa Kod C Saya Membaca Baris Terakhir Fail Teks Dua Kali Apabila Menyemak EOF?

Barbara Streisand
Barbara Streisandasal
2024-12-27 15:20:15983semak imbas

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

Menyelesaikan masalah Pembacaan EOF daripada Fail Teks

Apabila membaca daripada fail teks sehingga akhir fail (EOF) dicapai, adalah penting untuk memahami gelagat aliran input untuk mengelakkan baris pendua.

Dalam C , objek ifstream ialah digunakan untuk membaca daripada fail teks. Kod yang disediakan menggambarkan pendekatan biasa untuk membaca integer daripada fail teks, tetapi ia menghadapi isu apabila baris terakhir dibaca dua kali.

Memahami Isu

The masalah timbul kerana fungsi eof() menyemak EOF berdasarkan penunjuk dalaman strim, yang diletakkan selepas aksara terakhir fail apabila EOF dicapai. Kod membaca baris terakhir sekali apabila ia menemui integer dan sekali lagi apabila ia menyemak EOF dalam gelung.

Penyelesaian

Untuk membetulkannya, dinasihatkan untuk menyemak untuk EOF sebelum membaca integer dalam gelung. Ini memastikan bahawa integer terakhir dibaca sekali sahaja:

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

Di sini, iFile.peek() menyemak aksara seterusnya dalam strim tanpa benar-benar membacanya. Jika ia bukan EOF, maka integer dibaca dan dikeluarkan.

Pendekatan Alternatif

Selain itu, kod boleh ditulis semula menggunakan fungsi getline untuk membaca keseluruhan baris daripada fail dan kemudian menghuraikan integer secara manual. Pendekatan ini mengelakkan isu EOF sama sekali:

ifstream iFile("input.txt");

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

Atas ialah kandungan terperinci Mengapa Kod C Saya Membaca Baris Terakhir Fail Teks Dua Kali Apabila Menyemak EOF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn