带有文件流的 RAII

RAII with a filestream

在c++语言中,打开和操作文件的方式有很多种。然而,RAII 方法非常流行,因为析构函数负责释放内存。

但是文件流的关闭呢?据我所知,析构程序无论如何都应该关闭文件。然而,析构函数也不允许抛出任何异常。因此,如果我不关闭我的流并且它在一个块的末尾被破坏,我可能会丢失有关错误的信息,这可能在关闭时发生。

我的想法对吗?尽管有 RAII 方法,我应该始终关闭我的流?

示例:

{
  std::ofstream ofs;
  ofs.open ("test.txt");

  ofs << "blablabla";

  //do i need the following?
  ofs.close();
}

您应该让 fstream 析构函数关闭文件。

如您所说,析构函数不会抛出,因此您永远不会看到关闭文件时发生的任何错误,但是 std::basic_fstream::close() 成员函数有一个 void return 类型,这样也不会发出错误信号。别担心这个;只允许析构函数像任何其他 RAII class.

一样关闭文件

注意,buffer that underlies the fstream has a close() 成员函数也是。此函数 returns NULL 如果出现错误,或 this 指针成功。此函数从 basic_filebuf 的析构函数中调用,后者又从 basic_fstream 的析构函数中调用。正常使用不应该直接调用这个。

答案取决于您是否要在关闭时对错误做出反应。

如果你想做出反应,你必须手动close并检查错误情况(关闭失败将设置failbit):

std::ofstream str;
// Do something
str.close();
if (str.fail()) {
   // react on error
}

如果你不想做出反应,何必呢?就让析构函数关闭文件