close()使用时需要手动调用std::ifstream吗?
close()
std::ifstream
例如,在代码中:
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"); }
我需要file.close()手动调用吗?不应该ifstream使用RAII来关闭文件吗?
file.close()
ifstream
不
这就是 RAII 的用途,让析构函数完成它的工作。手动关闭它并没有什么坏处,但这不是 C++ 的方式,它是在 C 中使用类进行编程。
如果你想在函数结束之前关闭文件,你总是可以使用嵌套范围。
在标准(27.8.1.5 类模板 basic_ifstream)中,将使用持有实际文件句柄ifstream的成员来实现。basic_filebuf它作为一个成员保存,因此当 ifstream 对象析构时,它也会调用析构函数 on basic_filebuf。从标准(27.8.1.2)来看,该析构函数会关闭文件:
basic_filebuf
virtual 藴basic_filebuf(); 效果: 销毁类的对象basic_filebuf<charT,traits>。来电close()。
virtual 藴basic_filebuf();
效果: 销毁类的对象basic_filebuf<charT,traits>。来电close()。
basic_filebuf<charT,traits>