Buku teks saya merekomendasikan penggunaan metode pengakses anggota iStreamVar.eof() saat menangani data tekstual dan while (iStreamVar) saat menangani data numerik.

Dapatkah seseorang tolong jelaskan mengapa itu penting?

Kutipan dari buku:

Menggunakan fungsi eof untuk menentukan status akhir file berfungsi paling baik jika inputnya adalah teks. Metode sebelumnya untuk menentukan status akhir file berfungsi paling baik jika inputnya terdiri dari data numerik.

Itu adalah satu-satunya hal yang disebutkan pada topik. Setelah ini, itu hanya menjelaskan bagaimana prosesnya bekerja.

1
extDependency 29 September 2021, 19:54

2 jawaban

Jawaban Terbaik

Metode mana yang Anda gunakan untuk menentukan akhir data bergantung pada bagaimana Anda menggunakannya. Dugaan saya adalah, kedua metode yang disebutkan buku teks Anda salah digunakan, sehingga gagal dalam situasi yang berbeda. Itu sebabnya ia merekomendasikan menggunakan metode yang berbeda dalam situasi yang berbeda.

Metode yang benar tidak sepele, dan itu tergantung pada seberapa penting ketahanan kesalahan bagi Anda.

Jika Anda ingin membaca aliran yang dibatasi spasi dengan angka di dalamnya, dan Anda yakin file tersebut tidak mengandung kesalahan, kodenya paling sederhana:

int value;
while (iStreamVar >> value)
{
   ...
}

Perhatikan bahwa ini bukan salah satu dari dua opsi asli.

Jika file Anda berisi data tekstual yang dibatasi spasi, dan Anda yakin tidak ada kesalahan, gunakan kode yang sama (tetapi nyatakan variabel sementara sebagai string alih-alih int).

Jika Anda ingin mendeteksi dan memulihkan dari kesalahan, gunakan kode yang lebih rumit. Tetapi saya tidak dapat merekomendasikan Anda struktur kode tertentu - itu tergantung pada apa yang sebenarnya ingin Anda lakukan jika terjadi kesalahan. Juga:

  • Apakah catatan teks dibatasi oleh spasi atau baris baru?
  • Bagaimana jika file teks input berisi baris kosong?
  • Angka - floating-point atau tidak?
  • Bilangan - jika ada karakter yang menyimpang seperti a di antara data bilangan, apa yang harus dilakukan?

Jadi tidak ada resep tunggal yang benar untuk melakukan input yang tepat dengan ketahanan kesalahan.

1
anatolyg 29 September 2021, 17:21

Kecuali ada sesuatu yang signifikan dalam konteks yang tidak ditampilkan dalam pertanyaan, kutipan itu tidak masuk akal.

Cara membaca dari file dan memeriksa keberhasilannya adalah dengan membaca dari file:

int data;
if (std::cin >> data)
    std::cout << "read succeeded, value is " << data << '\n';

std::string data;
if (std::cin >> data)
    std::cout << "read succeeded, value is " << data << '\n';

std::string data;
if (std::getline(std::cin, data)
    std::cout << "read succeeded, value is " << data << '\n';

Jika upaya membaca gagal, Anda dapat memanggil .eof() untuk mengetahui apakah kegagalan itu karena input berada di akhir file. Bertentangan dengan apa yang diharapkan beberapa pemula (dan apa yang dilakukan beberapa bahasa), jika .eof() mengembalikan false, itu tidak berarti ada data yang tersisa di aliran input. Aliran mungkin di akhir file setelah pembacaan yang berhasil menghabiskan input yang tersisa. .eof() akan mengembalikan false, tetapi upaya membaca berikutnya akan gagal, dan setelah itu, .eof() akan mengembalikan true.

std::stringstream input("1234");
int data;
input >> data; // succeeds
std::cout << input.eof() << '\n'; // outputs 0, no failure
input >> data; // fails, no more input
std::cout << input.eof() << '\n'; // outputs 1, failed because at end of file
0
Pete Becker 29 September 2021, 18:34