我是否需要手动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。