Rumah > pembangunan bahagian belakang > C++ > Mengapakah `ifstream::eof()` Berkelakuan Berbeza dengan `get()` dan Operator Pengekstrakan (`>>`)?

Mengapakah `ifstream::eof()` Berkelakuan Berbeza dengan `get()` dan Operator Pengekstrakan (`>>`)?

DDD
Lepaskan: 2024-12-02 06:36:11
asal
937 orang telah melayarinya

Why Does `ifstream::eof()` Behave Differently with `get()` and the Extraction Operator (`>>`)?
>`)? " />

Menyelam ke dalam Fungsi eof() ifstream

Memahami gelagat fungsi eof() ifstream mungkin membingungkan, seperti yang digambarkan dalam coretan kod yang disediakan:

termasuk

serta

int main() {

std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
    std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
    std::cout << c << "\n";
}
return 0;
Salin selepas log masuk

}

Mari kita mendalami penjelasannya disediakan:

When EOF Really Sets In

Fungsi eof() mengesan apabila operasi baca cuba mengakses data di luar hujung fail.

  • Jika anda mempunyai fail dengan kandungan "abc" dan membaca 3 aksara, eof() akan false.
  • Tetapi jika anda cuba membaca aksara ke-4, eof() akan menjadi benar, menunjukkan bahawa penghujung fail telah dicapai.

Sebab kelakuan ini adalah untuk memastikan keserasian dengan peranti yang berbeza, seperti paip dan soket, di mana konsep saiz fail mungkin tidak semudah dengan teks fail.

Menyingkap Keajaiban get() dan >>

Dua gelung dalam coretan kod menggunakan pendekatan berbeza untuk membaca kandungan fail:

  • Gelung pertama menggunakan inf.get() untuk mendapatkan semula aksara satu demi satu. Apabila penghujung fail dicapai, get() mengembalikan -1.
  • Gelung kedua menggunakan inf >> c, yang menggabungkan percubaan baca dan tugasan dalam satu operasi. Pendekatan ini menetapkan c kepada nilai yang dibaca daripada fail, tetapi jika pembacaan gagal (disebabkan mencapai penghujung fail), ia dinilai sebagai palsu, menamatkan gelung.

Ini menjelaskan mengapa gelung pertama membaca aksara tambahan dan memaparkan -1, manakala gelung kedua memberikan output yang betul - ia menamatkan gelung sebelum cuba membaca di luar penghujung fail.

Mengelakkan Bahaya -1

Untuk mengelakkan bergantung pada nombor ajaib -1 untuk mengenal pasti penghujung fail, disyorkan untuk menggunakan std: :char_traits::eof() atau std::istream::traits_type::eof() sebaliknya.

Atas ialah kandungan terperinci Mengapakah `ifstream::eof()` Berkelakuan Berbeza dengan `get()` dan Operator Pengekstrakan (`>>`)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan