Rumah >pembangunan bahagian belakang >C++ >Mengapa Semakan EOF Saya Mengulang Baris Terakhir Apabila Membaca Fail Teks?

Mengapa Semakan EOF Saya Mengulang Baris Terakhir Apabila Membaca Fail Teks?

Patricia Arquette
Patricia Arquetteasal
2024-12-31 12:18:09785semak imbas

Why Does My EOF Check Repeat the Last Line When Reading a Text File?

Pepijat Pendua: EOF Mengulang Baris Terakhir dalam Bacaan Fail Teks

Kod yang dimaksudkan bertujuan untuk membaca integer daripada fail teks baris demi baris sehingga mencapai penunjuk akhir fail (EOF). Walau bagaimanapun, lelaran terakhir secara tidak dijangka membaca integer terakhir dua kali.

Akar Isu:

Isunya terletak pada sifat pembacaan fail. Apabila aliran input mencapai tanda EOF, ios::eofbit dinaikkan. Bit ini menunjukkan bahawa operasi baca terakhir menemui EOF, bukannya strim berada di penghujung fail.

Analisis Terperinci:

Pertimbangkan urutan peristiwa berikut :

  1. Baca integer 10.
  2. Baca integer 20.
  3. Baca integer 30.
  4. Temui EOF selepas membaca 30.

Dalam lelaran terakhir, integer 30 masih nilai semasa dalam aliran input. Apabila EOF ditemui, ios::eofbit dinaikkan, tetapi nilai x kekal 30. Kod meneruskan untuk mengeluarkan nilai x (iaitu 30) dan menyemak EOF dalam keadaan gelung. Memandangkan EOF kini ditetapkan, atur cara keluar dari gelung.

Pembetulan Cadangan:

Untuk menangani pepijat ini, gantikan keadaan gelung dengan semakan yang lebih jelas untuk EOF:

while (true) {
    int x;
    iFile >> x;
    if (iFile.eof()) break;
    cerr << x << endl;
}

Dengan memeriksa EOF secara eksplisit selepas setiap operasi baca, kod memastikan bahawa yang terakhir integer tidak dibaca dan dicetak dua kali.

Pepijat Tambahan:

Kod asal juga tidak mempunyai semakan ralat. Jika fail input kosong, gelung tidak akan ditamatkan kerana eofbit tidak akan dinaikkan sehingga operasi baca pertama menemui EOF. Untuk mengelakkan ini, tambahkan pengendalian ralat yang sesuai sebelum cuba membaca daripada fail.

Atas ialah kandungan terperinci Mengapa Semakan EOF Saya Mengulang Baris Terakhir Apabila Membaca Fail Teks?. 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