首页  >  文章  >  后端开发  >  您应该在 C 中手动关闭'ifstream”吗?

您应该在 C 中手动关闭'ifstream”吗?

Patricia Arquette
Patricia Arquette原创
2024-11-26 00:32:09184浏览

Should You Manually Close an `ifstream` in C  ?

手动关闭ifstream是否可以增强RAII?

问题:

使用std::ifstream时,我们是否应该手动调用close()? ifstream 不是使用 RAII 来自动处理文件关闭吗?

示例代码:

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 中进行编程。

如果需要在函数结束之前关闭文件,可以使用嵌套作用域:

std::ifstream file(fileName.c_str());
{
    std::stringstream buffer;
    buffer << file.rdbuf();
} // scope ends; file closed here

根据标准(27.8.1.5,类模板basic_ifstream),ifstream应该用basic_filebuf来实现包含真实文件句柄的成员。该成员确保当 ifstream 对象被销毁时,它还会调用 basic_filebuf 析构函数。根据标准 (27.8.1.2),此析构函数关闭文件:

virtual ˜basic_filebuf();
Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.

以上是您应该在 C 中手动关闭'ifstream”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn