Menguji Keadaan Input Strim lwn. Kejayaan Masa Hadapan
Apabila membaca input menggunakan strim, adalah penting untuk memahami perbezaan antara menguji keadaan aliran dan meramalkan kejayaan operasi masa hadapan.
Isu: Membaca Baris Terakhir Dua kali
ifstream f("x.txt"); string line; while (f.good()) { getline(f, line); // Use line here. }
Dalam kod ini, baris terakhir dibaca dua kali kerana f.good() menguji keadaan strim semasa, bukan sama ada getline() akan berjaya. Setelah getline() mencapai EOF, f kekal dalam keadaan "baik", jadi gelung diteruskan walaupun selepas baris terakhir dibaca.
Penyelesaian: Strim Ujian Selepas Operasi
Sebaliknya, semak keadaan strim selepas melakukan operasi input:
ifstream f("x.txt"); string line; while (getline(f, line)) { // Use line here. }
Penggunaan Alternatif eof()
Walaupun tidak disyorkan untuk menggunakan eof() dalam keadaan gelung, berikut ialah penyelesaian yang setara menggunakan !f.eof():
ifstream f("x.txt"); string line; while (!f.eof()) { if (getline(f, line)) { // Use line here. } else { break; } }
Julat -Gelung Berasaskan untuk Semua Baris
Untuk membaca dan memproses semua baris, gunakan julat berasaskan gelung:
ifstream f("x.txt"); for (std::string line; getline(f, line);) { process(line); }
Good vs. Stream State
Perhatikan bahawa f.good() salah nama. Ia tidak benar-benar menunjukkan "kebaikan" aliran tetapi sebaliknya kembali benar apabila aliran tidak berada dalam keadaan "gagal" atau "buruk". Sentiasa uji strim itu sendiri (iaitu, semak keadaan gagal terbaliknya) selepas melakukan operasi input untuk memastikan kejayaan.
Atas ialah kandungan terperinci Bagaimana untuk Menguji Akhir Fail Dengan Betul Apabila Membaca dari Strim Fail dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!