我是否需要手动closuresifstream?

当我使用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"); } 

我需要手动调用file.close()吗? 不应该使用RAII来closures文件吗?

没有

这就是RAII所要做的,让破坏者去做它的工作。 手动closures它没有什么坏处,但它不是C ++的方式,它是用C编程的。

如果要在函数结束之前closures文件,则始终可以使用嵌套的作用域。

在标准(27.8.1.5类模板basic_ifstream)中, ifstream将使用一个保存实际文件句柄的basic_filebuf成员来实现。 它作为一个成员保存,以便当一个ifstream对象破坏时,它也调用basic_filebuf上的析构函数。 并从标准(27.8.1.2),该析构函数closures文件:

virtual ˜basic_filebuf();

效果:破坏类basic_filebuf<charT,traits> 。 调用close()

你需要closures文件吗?
没有

你应该closures文件吗?
依靠。

如果文件无法正确closures,您是否在意可能发生的错误情况? 请记住,closures调用setstate(failbit),如果失败。 析构函数会因RAII而自动调用close() 函数,但不会因为对象不再存在而对失败位进行testing。

我同意@Martin。 如果写入文件,则数据可能仍然位于缓冲区中,直到调用close()时才可能写入文件。 没有手动做,你不知道是否有错误。 不向用户报告错误是非常糟糕的做法。

不,这是由ifstream析构函数自动完成的。 你应该手动调用它的唯一原因是因为fstream实例有一个很大的范围,例如,如果它是一个长寿命类实例的成员variables。