问题:
使用std::ifstream时,我们是否应该手动调用close()? ifstream 不是使用 RAII 来自动处理文件关闭吗?
示例代码:
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 来关闭文件吗?
答案:
不是。
RAII 是设计出来的正是为了这个目的。允许析构函数执行其预期功能。手动关闭文件不会造成任何损害,但它偏离了 C 约定,类似于使用类在 C 中进行编程。
如果需要在函数结束之前关闭文件,可以使用嵌套作用域:
std::ifstream file(fileName.c_str()); { std::stringstream buffer; buffer << file.rdbuf(); } // scope ends; file closed here
根据标准(27.8.1.5,类模板basic_ifstream),ifstream应该用basic_filebuf来实现包含真实文件句柄的成员。该成员确保当 ifstream 对象被销毁时,它还会调用 basic_filebuf 析构函数。根据标准 (27.8.1.2),此析构函数关闭文件:
virtual ˜basic_filebuf(); Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.
以上是您应该在 C 中手动关闭'ifstream”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!