Namun, programmer C ++ mencatat bahwa yang selalu terjadi adalah cin.eof () tidak mengembalikan "true" sampai setelah baris terakhir dibaca dua kali.
Bukan itu yang terjadi. Tidak eofbit
memainkan peran dalam konversi ke boolean ( stream::operator bool
(atau operator void*
lebih tua c ++)). Hanya badbit
dan failbit
terlibat.
Misalkan Anda membaca file yang berisi angka yang dipisahkan oleh spasi. Sebuah loop berbasis di sekitar cin.eof()
pasti akan salah atau penuh dengan if
tes. Anda tidak membaca sampai EOF. Anda membaca angka. Jadi buat kode Anda menyatakan logika itu:
while (stream >> some_var) {
process_value(some_var);
}
Ini akan berfungsi apakah baris terakhir file berakhir dengan 0 42\n
atau hanya 0 42
(tidak ada baris baru di akhir baris terakhir dalam file). Jika file berakhir dengan 0 42\n
, bacaan baik terakhir akan mengambil nilai 42 dan membaca akhir dari penanda baris. Perhatikan bahwa penanda EOF belum dibaca. Fungsi process_value
ini disebut dengan 42
. Panggilan berikutnya ke operator ekstraksi aliran >> membaca EOF, dan karena tidak ada yang telah diekstraksi, keduanya eofbit
dan failbit
akan ditetapkan.
Misalkan di sisi lain, file berakhir dengan 0 42
(tidak ada baris baru di akhir baris terakhir). Pembacaan baik terakhir akan mengambil nilai 42 yang berakhir pada penanda EOF. Agaknya Anda ingin memproses itu 42. Inilah sebabnya mengapa eofbit
tidak memainkan peran dalam operator konversi boolean aliran input. Pada panggilan berikutnya ke operator ekstraksi aliran >>, mesin yang mendasarinya dengan cepat melihat bahwa eofbit
sudah diatur. Ini dengan cepat menghasilkan pengaturan failbit
.
Mengapa potongan kode pertama selalu gagal berfungsi dengan baik?
Karena Anda seharusnya tidak memeriksa EOF sebagai kondisi loop. Kondisi loop harus menyatakan apa yang Anda coba lakukan, yaitu (misalnya), mengekstraksi angka dari aliran.