Edi*_*enz 187 c++ raii ifstream
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");
}
Run Code Online (Sandbox Code Playgroud)
我需要file.close()手动拨打电话吗?不应该ifstream使用RAII来关闭文件?
Ecl*_*pse 239
没有
这就是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().
Mar*_*ork 65
你需要关闭文件吗?
没有
你应该关闭文件吗?
要看.
您是否关心文件无法正确关闭时可能出现的错误情况?setstate(failbit)如果失败,请记住关闭呼叫.close()由于RAII,析构函数会自动为您调用,但由于对象不再存在,因此不会为您提供测试失败位的方法.
您可以允许析构函数完成其工作。但就像任何 RAII 对象一样,有时手动调用 close 可能会产生影响。例如:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
写入文件内容。但:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
没有。这些是进程突然退出的罕见情况。崩溃的进程也可以做类似的事情。
不,这是由ifstream析构函数自动完成的.您应该手动调用它的唯一原因是因为fstream实例具有大范围,例如,如果它是长生命类实例的成员变量.
| 归档时间: |
|
| 查看次数: |
63534 次 |
| 最近记录: |