当我使用std::ifstream时,我需要手动调用close()吗?
例如,在代码中:
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来关闭文件吗?
NO
这就是RAII的作用,让析构函数完成它的工作。手动关闭它没有什么坏处,但这不是c++的方式,它是用C语言和类编程。
如果想在函数结束之前关闭文件,可以使用嵌套作用域。
在标准(27.8.1.5类模板basic_ifstream)中,ifstream将由一个持有实际文件句柄的basic_filebuf成员实现。它作为一个成员保存,这样当一个ifstream对象析构时,它也会调用basic_filebuf上的析构函数。在标准(27.8.1.2)中,析构函数关闭文件:
虚拟˜basic_filebuf ();
效果:销毁类basic_filebuf<charT,traits>的对象。调用close()。
你可以让析构函数完成它的工作。但就像任何RAII对象一样,有时手动调用close会产生不同的结果。例如:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
写入文件内容。但是:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
不喜欢。这是进程突然退出的罕见情况。崩溃进程也可以做类似的事情。
NO
这就是RAII的作用,让析构函数完成它的工作。手动关闭它没有什么坏处,但这不是c++的方式,它是用C语言和类编程。
如果想在函数结束之前关闭文件,可以使用嵌套作用域。
在标准(27.8.1.5类模板basic_ifstream)中,ifstream将由一个持有实际文件句柄的basic_filebuf成员实现。它作为一个成员保存,这样当一个ifstream对象析构时,它也会调用basic_filebuf上的析构函数。在标准(27.8.1.2)中,析构函数关闭文件:
虚拟˜basic_filebuf ();
效果:销毁类basic_filebuf<charT,traits>的对象。调用close()。