小编典典

我需要手动关闭 ifstream 吗?

all

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");
}

我需要file.close()手动调用吗?不应该ifstream使用RAII来关闭文件吗?


阅读 129

收藏
2022-06-01

共1个答案

小编典典

这就是 RAII 的用途,让析构函数完成它的工作。手动关闭它并没有什么坏处,但这不是 C++ 的方式,它是在 C 中使用类进行编程。

如果你想在函数结束之前关闭文件,你总是可以使用嵌套范围。

在标准(27.8.1.5 类模板
basic_ifstream)中,将使用持有实际文件句柄ifstream的成员来实现。basic_filebuf它作为一个成员保存,因此当
ifstream 对象析构时,它也会调用析构函数 on basic_filebuf。从标准(27.8.1.2)来看,该析构函数会关闭文件:

virtual 藴basic_filebuf();

效果: 销毁类的对象basic_filebuf<charT,traits>。来电close()

2022-06-01