当前位置:  开发笔记 > 编程语言 > 正文

我需要手动关闭ifstream吗?

如何解决《我需要手动关闭ifstream吗?》经验,为你挑选了4个好方法。

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



1> Eclipse..:

没有

这就是RAII的用途,让析构函数完成它的工作.手动关闭它没有什么害处,但它不是C++方式,它是用C语言编写的.

如果要在函数结束之前关闭文件,则始终可以使用嵌套范围.

在标准(27.8.1.5类模板basic_ifstream)中,ifstream将使用包含basic_filebuf实际文件句柄的成员来实现.它作为成员保存,以便当ifstream对象析构时,它也会调用析构函数basic_filebuf.从标准(27.8.1.2)开始,析构函数关闭文件:

virtual ˜basic_filebuf();

效果:销毁类的对象basic_filebuf.打电话close().


+1 - 至少有一个人知道RAII的含义:-)
使用嵌套范围只是为了关闭文件是完全人为的 - 如果你想关闭它,请在它上面调用close().
在C++中,嵌套作用域几乎从不必要.它们与代码的行为有关,特别是在抛出某些东西时.如果未来的维护者删除它们,他就不太了解C++.
+1我不知道RAII处理那个......我猜你每天都学到新东西
虽然,您可能会认为将对象的生命周期限制在必要的范围内意味着您不会意外访问已关闭的ifstream.但这有点做作.
有时您确实需要手动调用close()来进行错误处理。

2> Martin York..:

你需要关闭文件吗?
没有

你应该关闭文件吗?
要看.

您是否关心文件无法正确关闭时可能出现的错误情况?setstate(failbit)如果失败,请记住关闭呼叫.close()由于RAII,析构函数会自动为您调用,但由于对象不再存在,因此不会为您提供测试失败位的方法.



3> 小智..:

我同意@Martin.如果您写入文件,数据可能仍然位于缓冲区上,并且在close()调用之前可能无法写入文件.如果不手动操作,您不知道是否存在错误.不向用户报告错误是一种非常糟糕的做法.



4> Dimitri C...:

不,这是由ifstream析构函数自动完成的.您应该手动调用它的唯一原因是因为fstream实例具有大范围,例如,如果它是长生命类实例的成员变量.


如果流允许例外,另一个原因可能是检查文件关闭错误并防止抛出析构函数.
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有