带有文件流的 RAII

hr0*_*r0m 5 c++ fstream raii

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

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

我的想法正确吗?尽管采用 RAII 方法,我应该始终关闭我的流吗?

例子:

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

  ofs << "blablabla";

  //do i need the following?
  ofs.close();
}
Run Code Online (Sandbox Code Playgroud)

kin*_*nak 4

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

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

std::ofstream str;
// Do something
str.close();
if (str.fail()) {
   // react on error
}
Run Code Online (Sandbox Code Playgroud)

如果你不想做出反应,为什么还要麻烦呢?只需让析构函数关闭文件即可