Rumah >pembangunan bahagian belakang >C++ >Mengapa Semakan EOF Saya Mengulang Baris Terakhir Apabila Membaca Fail Teks?
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 :
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!