我需要手动关闭 ifstream 吗?

问题描述 投票:0回答: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 来关闭文件吗?

c++ ifstream raii
4个回答
306
投票

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

如果您想在函数结束之前关闭文件,您始终可以使用嵌套作用域。

在标准(27.8.1.5 类模板 basic_ifstream)中,

ifstream
将使用持有实际文件句柄的
basic_filebuf
成员来实现。它被保存为成员,以便当 ifstream 对象析构时,它还会调用
basic_filebuf
上的析构函数。根据标准(27.8.1.2),该析构函数关闭文件:

virtual ˜basic_filebuf();

效果: 销毁

basic_filebuf<charT,traits>
类的对象。打电话给
close()


82
投票

需要关闭文件吗?

您应该关闭文件吗?
视情况而定。

您是否关心文件无法正确关闭时可能出现的错误情况?请记住,如果失败, close 会调用

setstate(failbit)
。由于 RAII
,析构函数会自动为您调用 
close(),但不会为您留下测试失败位的方法,因为对象不再存在。


7
投票
不,这是由

ifstream

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


7
投票
您可以允许析构函数完成其工作。但就像任何 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); }
没有。这些是进程突然退出的罕见情况。崩溃的进程也可以做类似的事情。

© www.soinside.com 2019 - 2024. All rights reserved.