题
我需要人工呼叫 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()
.
其他提示
你需要关闭该文件?
没有
你应该靠的文件?
依赖。
你关心的可能的错误的条件下可能发生如果该文件无法关闭是否正确?记住,接近电话 setstate(failbit)
如果它失败。析构将呼叫 close()
为你自由的 RAII 但是不会离开你的方式的测试失败位作为对象不再存在。
我同意@马丁。如果你写的文件,该数据仍然可能会坐在一个缓冲区,可能不会得到写入文件,直到 close()
被称为。没有这样做的手动,你不知道是否有错误或没有。不报告的错误用户是一个非常糟糕的做法。
不,这样做是自动的 ifstream
析构函数。的唯一原因你应该叫它手是因为 fstream
实例具有一个大的范围,例如,如果这是一件可变的一个长长的生活类实例。
你可以允许析构做的工作。但是,就像任何RAII对象有时可能强调的是,对手动接近可以做一个区别。例如:
#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);
}
不。这些都是罕见的情况下,一个过程突然退出。一个崩溃的过程中可以做的相类似。