这个问题:How to protect log from application crash?已经引导我到另一个 - std::ofstream::close()
实际上做了什么?我知道它叫flush()
,那是一回事。但是还有什么?关闭文件实际上是什么?std :: ofstream :: close()实际上做了什么?
编辑: 让我改我的问题 - 是什么亲自作出的通话过程中的实际文件到close()
或只是std::ofstream
内部清理的东西?
这个问题:How to protect log from application crash?已经引导我到另一个 - std::ofstream::close()
实际上做了什么?我知道它叫flush()
,那是一回事。但是还有什么?关闭文件实际上是什么?std :: ofstream :: close()实际上做了什么?
编辑: 让我改我的问题 - 是什么亲自作出的通话过程中的实际文件到close()
或只是std::ofstream
内部清理的东西?
除了刷新用户空间的缓冲区,即flush()
,close(2)
被称为底层文件描述符。它取决于操作系统然后会发生什么,但很可能没有发生该文件占用的实际存储空间。
什么将发生的是,(如果文件描述符是该进程中该文件的最后一个引用)与该文件关联的文件条目从进程的开放文件表中删除。即释放与进程相关的内核内存。
关闭当前与对象关联的文件,将其与流关联。
任何挂起的输出序列被写入文件。
如果该流当前没有与任何文件相关联(即没有文件已经成功打开),调用该函数失败。
流的文件关联由其内部流缓冲区保存: 该函数在内部调用rdbuf() - > close(),并在发生故障时设置failbit。
请注意,任何打开的文件在流股对象被销毁时会自动关闭。
来源:http://www.cplusplus.com/reference/fstream/ofstream/close/
下面是从文件调用的跟踪:
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()
和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()
。
我改写了我的问题,请参阅原始帖子的编辑。 – NPS 2013-04-28 22:10:00