从c ++ 11开始,我们可以将一个std::fstream
对象移动到另一个,但是我找不到文档说明,如果fstream
对象已经与之关联,会发生什么文件(is_open()==true
)。
所以我的问题是,在以下代码中,File1.txt
是否会正确关闭,或者是否必须手动关闭它。如果我必须手动完成,如果我不这样做会发生什么?
std::fstream file("File1.txt");
file = std::fstream("File2.txt"); //will this implicitly call file.close()?
答案 0 :(得分:7)
fstream
对象的移动分配将导致其关联的filebuf
的移动分配。该文档清楚地表明旧文件首先被关闭(如果file.rdbuf()->close()
不是file.close()
):
<强>
basic_filebuf& operator=(basic_filebuf&& rhs);
强>
- 效果:调用
this->close()
然后从rhs
移动分配。在移动作业*this
具有可观察状态之后,如果它是从rhs
移动构建的话,它将具有可观察状态。- 返回:
醇>*this
。<强>
basic_fstream& operator=(basic_fstream&& rhs);
强>
- 效果:移动会从
*this
的基础和相应成员中分配rhs
的基础和成员。- 返回:
醇>*this
。
(这是n4527草案中的措辞,至少从n3485起未改变)
答案 1 :(得分:4)
由于实际的文件相关机器被隐藏了#39在相应的缓冲区内(流实际上主要提供格式化IO),您应该查看std::basic_filebuf
文档:
首先调用close()来关闭相关文件,然后移动 rhs的内容进入* this:put和get buffer,关联 file,locale,openmode,is_open标志和任何其他状态。 移动后,rhs不与文件关联,rhs.is_open()== 假的。
从http://en.cppreference.com/w/cpp/io/basic_filebuf/operator%3D
复制