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来关闭文件?
没有
这就是RAII的用途,让析构函数完成它的工作.手动关闭它没有什么害处,但它不是C++方式,它是用C语言编写的.
如果要在函数结束之前关闭文件,则始终可以使用嵌套范围.
在标准(27.8.1.5类模板basic_ifstream)中,ifstream
将使用包含basic_filebuf
实际文件句柄的成员来实现.它作为成员保存,以便当ifstream对象析构时,它也会调用析构函数basic_filebuf
.从标准(27.8.1.2)开始,析构函数关闭文件:
virtual ˜basic_filebuf();
效果:销毁类的对象
basic_filebuf
.打电话close()
.
你需要关闭文件吗?
没有
你应该关闭文件吗?
要看.
您是否关心文件无法正确关闭时可能出现的错误情况?setstate(failbit)
如果失败,请记住关闭呼叫.close()
由于RAII,析构函数会自动为您调用,但由于对象不再存在,因此不会为您提供测试失败位的方法.
我同意@Martin.如果您写入文件,数据可能仍然位于缓冲区上,并且在close()
调用之前可能无法写入文件.如果不手动操作,您不知道是否存在错误.不向用户报告错误是一种非常糟糕的做法.
不,这是由ifstream
析构函数自动完成的.您应该手动调用它的唯一原因是因为fstream
实例具有大范围,例如,如果它是长生命类实例的成员变量.