这是来自文档的调用跟踪:
void std::basic_ofstream::close();
有效地调用rdbuf()->close()。如果运行过程中出现错误,则调用setstate(failbit)。
std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const;
返回关联的流缓冲区。如果没有关联的流缓冲区,则返回NULL。
std::basic_streambuf实际上继承了std::basic_filebuf,因此:
std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close();
如果存在 put 区域(例如,打开文件进行写入),首先调用 overflow(Traits::eof()) 将所有待处理的输出写入文件,包括任何 unshift 序列。
如果在underflow()、overflow()、seekpos() 和seekoff() 中最近调用的函数是overflow(),则调用std::codecvt::unshift(),可能多次调用,以根据到被灌输的语言环境,并用overflow(Traits::eof())将该序列写入文件。
然后,就像调用 std::fclose 一样关闭文件,无论前面的任何调用是成功还是失败。
注意:close() 通常是通过std::basic_filebuf 的析构函数调用的(反过来,它通常由std::basic_fstream 的析构函数调用。
首先,我们可以看到它实际上并没有像您预期的那样直接调用flush()。然而,flushing 效果确实发生在std::basic_filebuf::close() 方法中。此外,我们可以看到它仍然对文件进行了一些篡改,即写入 unshift 序列。然后没有什么特别的事情发生,文件只是关闭了。
注意上面的注意:在大多数情况下,您甚至不需要显式调用std::basic_ofstream::close()。