C++ 我是否需要手动关闭ifstream?

C++ 我是否需要手动关闭ifstream?,c++,ifstream,raii,C++,Ifstream,Raii,使用std::ifstream时是否需要手动调用close() 例如,在代码中: std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close();

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

例如,在代码中:

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");
}
std::string readContentsOfFile(std::string文件名){
std::ifstream文件(fileName.c_str());
if(file.good()){
std::stringstream缓冲区;
缓冲液NO

<>这就是RAII的用法,让析构函数完成它的工作。手动关闭它没有坏处,但它不是C++方式,它是用C类编程的。 如果要在函数结束前关闭文件,则始终可以使用嵌套作用域

在标准(27.8.1.5类模板basic_ifstream)中,
ifstream
将使用持有实际文件句柄的
basic_filebuf
成员来实现。它作为一个成员来持有,这样当ifstream对象销毁时,它也会调用
basic_filebuf
上的析构函数,并从标准(27.8.1.2)中调用析构函数,该析构函数将关闭文件:

virtual«basic_filebuf();

效果:销毁类
basic\u filebuf
的对象。调用
close()


是否需要关闭该文件?
没有

是否要关闭该文件?
视情况而定


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

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

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

您可以允许析构函数执行其工作。但与任何RAII对象一样,有时手动调用close可能会产生影响。例如:

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  return 0;
}
#包括
使用std::of流;
int main(){
ofs流(“hello.txt”);

ofs+1我不知道RAII会处理这个问题……我想你每天都会学到一些新东西,使用嵌套作用域来关闭文件完全是人为的——如果你想关闭它,请调用close()但是,你可能会认为限制对象的生命周期到必要的范围意味着你不会意外地访问封闭的IFSULL。但是这是有点做作的。在C++中,嵌套的范围几乎是不必要的。它们与代码的行为有关,尤其是当某事发生时。如果将来的话。维护者删除它们,他不太熟悉C++。有时你需要手动调用<代码>关闭()/<代码>来进行错误处理。另一个原因可能是检查文件关闭错误并防止抛出析构函数,如果允许流使用异常。
#include <stdlib.h>

#include <fstream>

using std::ofstream;

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