带有文件流的 RAII
RAII with a filestream
在 c++ 语言中,有多种方法可以打开和操作文件。然而,RAII方法非常流行,因为destruktor负责释放内存。
但是关闭文件流呢?据我所知,destruktor无论如何都应该关闭文件。但是,destruktor也不允许抛出任何异常。因此,如果我不关闭我的流并且它在块结束时被破坏,我可能会丢失有关错误的信息,这可能会在关闭时发生。
我的想法正确吗?尽管采用了 RAII 方法,我应该始终关闭我的流?
例:
{
std::ofstream ofs;
ofs.open ("test.txt");
ofs << "blablabla";
//do i need the following?
ofs.close();
}
答案取决于你是否想在关闭时对错误做出反应。
如果要做出反应,则必须手动close
并检查错误条件(无法关闭将设置failbit
):
std::ofstream str;
// Do something
str.close();
if (str.fail()) {
// react on error
}
如果你不想反应,何必呢?只需让析构函数关闭文件
你应该让fstream
析构函数关闭文件。
正如您所说,析构函数不会引发,因此您永远不会看到关闭文件时发生的任何错误,但 std::basic_fstream::close()
成员函数具有void
返回类型,因此也不能发出错误信号。不要担心这个;只需允许析构函数关闭文件,就像任何其他 RAII 类一样。
请注意,fstream
基础的缓冲区也具有close()
成员函数。此函数返回NULL
如果出现错误,或返回成功时的this
指针。这个函数是从basic_filebuf
的析构函数调用的,而的析构函数又是从basic_fstream
的析构函数调用的。您不应该在正常使用下直接调用它。
相关文章:
- 具有瞬态资源的RAII类
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 在文件夹迭代上实现 RAII
- 带有文件流的 RAII
- 使用RAII写入文件结束标记
- 是boost映射文件RAII
- 是否有任何已实现的 RAII 文件句柄