为了账号安全,请及时绑定邮箱和手机立即绑定

我需要手动关闭ifstream吗?

我需要手动关闭ifstream吗?

慕哥9229398 2019-10-08 10:18:58
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关闭文件吗?
查看完整描述

4 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

没有


这就是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()。


查看完整回答
反对 回复 2019-10-08
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您需要关闭文件吗?

没有


您应该关闭文件吗?

要看。


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


查看完整回答
反对 回复 2019-10-08
?
郎朗坤

TA贡献1921条经验 获得超9个赞

您可以允许析构函数完成其工作。但是,就像任何RAII对象一样,有时手动调用close可能会有所作为。例如:


#include <fstream>


using std::ofstream;


int main() {

  ofstream ofs("hello.txt");

  ofs << "Hello world\n";

  return 0;

}

写入文件内容。但:


#include <stdlib.h>


#include <fstream>


using std::ofstream;


int main() {

  ofstream ofs("hello.txt");

  ofs << "Hello world\n";

  exit(0);

}

没有。在极少数情况下,进程突然退出。崩溃过程可能会执行类似的操作。


查看完整回答
反对 回复 2019-10-08
?
www说

TA贡献1775条经验 获得超8个赞

不,这是由ifstream析构函数自动完成的。您应该手动调用它的唯一原因是因为fstream实例的作用域很大,例如,如果它是寿命很长的类实例的成员变量。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 3252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信