2013-04-28 199 views

回答

3

除了刷新用户空间的缓冲区,即flush()close(2)被称为底层文件描述符。它取决于操作系统然后会发生什么,但很可能没有发生该文件占用的实际存储空间。

什么发生的是,(如果文件描述符是该进程中该文件的最后一个引用)与该文件关联的文件条目从进程的开放文件表中删除。即释放与进程相关的内核内存。

1

关闭当前与对象关联的文件,将其与流关联。

任何挂起的输出序列被写入文件。

如果该流当前没有与任何文件相关联(即没有文件已经成功打开),调用该函数失败。

流的文件关联由其内部流缓冲区保存: 该函数在内部调用rdbuf() - > close(),并在发生故障时设置failbit。

请注意,任何打开的文件在流股对象被销毁时会自动关闭。

来源:http://www.cplusplus.com/reference/fstream/ofstream/close/

+0

我改写了我的问题,请参阅原始帖子的编辑。 – NPS 2013-04-28 22:10:00

3

下面是从文件调用的跟踪:


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()

相关问题