使用
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<charT,traits>
。close()
需要关闭文件吗?
不
您应该关闭文件吗?
视情况而定。
您是否关心文件无法正确关闭时可能出现的错误情况?请记住,如果失败, close 会调用
setstate(failbit)
。由于 RAII,析构函数会自动为您调用
close()
,但不会为您留下测试失败位的方法,因为对象不再存在。
ifstream
析构函数自动完成的。您应该手动调用它的唯一原因是因为
fstream
实例具有很大的作用域,例如,如果它是长期存在的类实例的成员变量。
#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);
}
没有。这些是进程突然退出的罕见情况。崩溃的进程也可以做类似的事情。