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!