我需要手动关闭ifstream吗?

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关闭文件吗?


慕哥9229398
浏览 3255回答 4
4回答

米琪卡哇伊

没有这就是RAII的目的,让析构函数完成其工作。手动关闭它没有什么害处,但这不是C ++方式,而是使用类在C中进行编程。如果要在函数结束之前关闭文件,则可以始终使用嵌套作用域。在标准(27.8.1.5类模板basic_ifstream)中,ifstream将使用basic_filebuf拥有实际文件句柄的成员来实现。它作为成员保存,以便当ifstream对象销毁时,它还会在上调用销毁器basic_filebuf。根据标准(27.8.1.2),该析构函数将关闭文件:virtual ˜basic_filebuf();效果:销毁class对象basic_filebuf<charT,traits>。来电close()。

繁星点点滴滴

您需要关闭文件吗?没有您应该关闭文件吗?要看。您是否担心文件无法正确关闭时可能发生的错误情况?请记住,setstate(failbit)如果失败,则关闭呼叫。析构函数会调用close()自动为您因为RAII但不会离开你作为测试对象已不存在失败位的方法。

郎朗坤

您可以允许析构函数完成其工作。但是,就像任何RAII对象一样,有时手动调用close可能会有所作为。例如:#include <fstream>using std::ofstream;int main() {&nbsp; ofstream ofs("hello.txt");&nbsp; ofs << "Hello world\n";&nbsp; return 0;}写入文件内容。但:#include <stdlib.h>#include <fstream>using std::ofstream;int main() {&nbsp; ofstream ofs("hello.txt");&nbsp; ofs << "Hello world\n";&nbsp; exit(0);}没有。在极少数情况下,进程突然退出。崩溃过程可能会执行类似的操作。

www说

不,这是由ifstream析构函数自动完成的。您应该手动调用它的唯一原因是因为fstream实例的作用域很大,例如,如果它是寿命很长的类实例的成员变量。
打开App,查看更多内容
随时随地看视频慕课网APP