以下是文档中的调用跟踪:
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();
如果存在放置区域(例如打开文件进行写入),则首先调用overflow(Traits::eof())
将所有挂起的输出写入文件,包括任何未移位序列。
如果是最近调用的函数,则underflow()
, overflow()
, seekpos()
, and seekoff()
, was overflow()
,然后调用std::codecvt::unshift()
,也许多次,根据注入的语言环境确定 unshift 序列,并将该序列写入文件overflow(Traits::eof())
.
然后,关闭文件,就像调用std::fclose
,无论前面的任何调用是否成功或失败。
NOTE: close()
通常通过析构函数调用std::basic_filebuf
(反过来,它通常由析构函数调用std::basic_fstream
.
首先我们可以看到它实际上并没有调用flush()
直接如你所料。尽管如此,flushing效果确实发生在std::basic_filebuf::close()
方法。此外,我们可以看到它仍然对文件进行了一些篡改,即写入 unshift 序列。然后没有什么特别的事情发生,文件只是关闭。
注意NOTE上面:在大多数情况下你甚至不需要打电话std::basic_ofstream::close()
明确地。