这个问题:如何保护日志免受应用程序崩溃?引导我到另一个 - std::ofstream::close()实际上做了什么?我知道它的召唤flush(),这是一回事.但还有什么?实际关闭文件的是什么?
编辑:让我重新解释一下我的问题 - 在调用过程中对实际文件做了什么实际操作,close()还是只是std::ofstream内部清理?
除了刷新用户空间的缓冲区,即flush(),close(2)被称为底层文件描述符。这取决于操作系统会发生什么,但很可能文件占用的实际存储不会发生任何变化。
什么会发生的是,(如果该文件描述了在这个过程中该文件的最后一个引用)与文件被从进程的打开文件表中删除相关文件条目。即释放进程相关的内核内存。
这是来自文档的调用跟踪:
void std::basic_ofstream::close();
Run Code Online (Sandbox Code Playgroud)
有效通话rdbuf()->close()。如果操作过程中发生错误,setstate(failbit)则调用。
std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const;
Run Code Online (Sandbox Code Playgroud)
返回关联的流缓冲区。如果没有关联的流缓冲区,则返回NULL。
std::basic_streambuf实际上继承std::basic_filebuf,因此:
std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close();
Run Code Online (Sandbox Code Playgroud)
如果存在放置区域(例如,打开了要写入的文件),则首先调用overflow(Traits::eof())将所有待处理的输出写入文件,包括所有取消移位的序列。
如果最近调用的函数,出underflow(),overflow(),seekpos(),和seekoff(),是overflow(),然后调用std::codecvt::unshift(),或许多次,以根据灌输区域确定不印字序列,并且该序列写入到文件,overflow(Traits::eof())。
然后,就像调用一样关闭文件std::fclose,而不管前面的调用是成功还是失败。
注意: close()通常是通过(的析构函数调用的std::basic_filebuf,反之,通常是通过的析构函数调用的std::basic_fstream。
首先,我们可以看到它实际上并没有flush()像您期望的那样直接调用。然而,在该方法中确实发生了冲洗效果std::basic_filebuf::close()。另外,我们可以看到它仍然对文件进行了一些篡改,即写入了取消移位序列。然后,没有其他特殊情况,文件将简单关闭。
请注意上述注意事项:在大多数情况下,您甚至都不需要std::basic_ofstream::close()显式调用。