首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否需要手动关闭ifstream?

是否需要手动关闭ifstream?
EN

Stack Overflow用户
提问于 2009-04-14 14:59:26
回答 3查看 84.6K关注 0票数 234

使用std::ifstream时是否需要手动调用close()

例如,在代码中:

代码语言:javascript
复制
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来关闭文件吗?

EN

回答 3

Stack Overflow用户

发布于 2011-07-15 04:45:01

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

票数 15
EN

Stack Overflow用户

发布于 2018-05-22 19:37:40

你可以让析构函数来做它的工作。但就像任何RAII对象一样,有时手动调用close可能会有所不同。例如:

代码语言:javascript
复制
#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  return 0;
}

写入文件内容。但是:

代码语言:javascript
复制
#include <stdlib.h>

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  exit(0);
}

进程突然退出的情况很少见。崩溃过程也可以做类似的事情。

票数 6
EN

Stack Overflow用户

发布于 2009-04-15 09:24:44

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/748014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档