Soalan:
Apabila menggunakan std::ifstream, adakah kita perlu secara manual panggil close()? Bukankah RAII digunakan oleh ifstream untuk mengendalikan penutupan fail secara automatik?
Kod Contoh:
std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close(); return buffer.str(); } throw std::runtime_exception("file not found"); }
Adakah memanggil file.close() perlu? Adakah ifstream tidak menggunakan RAII untuk penutupan fail?
Jawapan:
Tidak.
RAII direka bentuk tepat untuk tujuan ini. Benarkan pemusnah melaksanakan fungsi yang dimaksudkan. Menutup fail secara manual tidak menyebabkan sebarang bahaya, tetapi ia menyimpang daripada konvensyen C dan menyerupai pengaturcaraan dalam C dengan kelas.
Jika anda perlu menutup fail sebelum fungsi tamat, anda boleh menggunakan skop bersarang:
std::ifstream file(fileName.c_str()); { std::stringstream buffer; buffer << file.rdbuf(); } // scope ends; file closed here
Mengikut standard (27.8.1.5, Class template basic_ifstream), ifstream harus dilaksanakan dengan ahli basic_filebuf yang menempatkan pemegang fail tulen. Ahli ini memastikan bahawa apabila objek ifstream dimusnahkan, ia juga memanggil pemusnah basic_filebuf. Dan mengikut standard (27.8.1.2), pemusnah ini menutup fail:
virtual ˜basic_filebuf(); Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.
Atas ialah kandungan terperinci Sekiranya Anda Menutup `ifstream` secara Manual dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!