Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menghalang Pembacaan Baris Terakhir Dua Kali Apabila Menggunakan `fstream` dalam C ?

Bagaimanakah Saya Boleh Menghalang Pembacaan Baris Terakhir Dua Kali Apabila Menggunakan `fstream` dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 02:32:13677semak imbas

How Can I Prevent Reading the Last Line Twice When Using `fstream` in C  ?

Menguji Strim fstream: Mengelakkan Isu Baris Akhir Dua Kali Baca dengan good() dan eof()

Menggunakan fstream untuk operasi input fail selalunya melibatkan pemeriksaan keadaan strim untuk menentukan bila hendak berhenti membaca. Walau bagaimanapun, menggunakan bendera negeri tertentu boleh membawa kepada isu yang tidak dijangka, seperti membaca baris terakhir dua kali. Artikel ini meneroka punca asas dan menyediakan penyelesaian untuk mengelakkan masalah ini.

Mengapa Baris Terakhir Dibaca Dua Kali

Isu timbul apabila menggunakan kebaikan() atau ! eof() keadaan dalam gelung sementara yang menggunakan getline() untuk membaca baris daripada fail. Inilah sebabnya mengapa ini berlaku:

  • good() tidak bersamaan dengan stream.operator bool(): Walaupun namanya, good() tidak secara langsung menunjukkan sama ada strim itu dalam keadaan baik. Sebaliknya, ia menguji keadaan aliran dan aksara buffer berikutan operasi getline(). Jika salah satu palsu, good() mengembalikan false. Ini boleh menyebabkan baris terakhir dibaca dua kali kerana getline() mungkin berjaya walaupun tiada lagi input selepas baris terakhir.

Betulkan: Gunakan getline()'s nilai pulangan untuk menyemak bacaan baris yang berjaya:

while (getline(stream, line)) {
  // Use line here.
}
  • eof() mencerminkan arus state: eof() menyemak sama ada strim telah mencapai kedudukan akhir fail (EOF). Walau bagaimanapun, mencapai EOF tidak semestinya bermakna operasi getline() terakhir gagal atau menunjukkan penghujung fail.

Betulkan: Semak sama ada operasi getline() adalah berjaya sebelum menyemak EOF:

if (getline(stream, line)) {
  // Use line here.
} else if (stream.eof()) {
  // Handle end-of-file condition.
} else {
  // Handle error condition.
}

Terbaik Amalan

Untuk mengelakkan isu ini dan memproses baris fail dengan cekap, pertimbangkan perkara berikut:

  • Gunakan >> operator: Terlebih beban untuk strim, operator ini boleh menyemak kejayaan atau kegagalan operasi input. Contohnya:
if (stream >> foo >> bar) {
  // Use foo and bar here.
} else {
  // Handle error condition.
}
  • Gunakan gelung untuk eksplisit: Ini menghapuskan keperluan untuk semakan keadaan aliran:
for (string line; getline(stream, line);) {
  // Use line here.
}

Dengan mengikuti garis panduan ini, anda boleh mengelak daripada membaca baris terakhir dua kali secara tidak sengaja dan memastikan pemprosesan input fail yang boleh dipercayai dengan fstream.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Pembacaan Baris Terakhir Dua Kali Apabila Menggunakan `fstream` dalam C ?. 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