[英]What does std::ofstream::close() actually do?
這個問題: 如何保護日志免受應用程序崩潰? 引導我到另一個 - std::ofstream::close()
實際上做了什么? 我知道它調用flush()
,這是一回事。 但還有什么? 實際關閉文件的是什么?
編輯:讓我重新解釋一下我的問題 - 在調用close()
期間對實際文件做了什么實際操作,還是只是std::ofstream
內部清理?
以下是文檔中的調用跟蹤:
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())
將所有掛起的輸出寫入文件,包括任何非移位序列。
如果最近調用的函數, seekpos()
underflow()
, overflow()
, seekpos()
和seekoff()
,則overflow()
,然后調用std::codecvt::unshift()
,可能多次,以確定根據嵌入的語言環境取消快照序列,並將該序列寫入帶overflow(Traits::eof())
文件overflow(Traits::eof())
。
然后,通過調用std::fclose
關閉文件,無論前面的任何調用是成功還是失敗。
注意: close()
通常通過std::basic_filebuf
的析構函數調用(反過來,它通常由std::basic_fstream
的析構函數std::basic_fstream
。
首先,我們可以看到它實際上並沒有按預期直接調用flush()
。 然而, 刷新效果確實發生在std::basic_filebuf::close()
方法中。 另外,我們可以看到它仍然會對文件進行一些篡改,即編寫非移位序列。 沒有其他特殊的事情發生,文件只是關閉。
請注意上面的注意事項 :在大多數情況下,您甚至不需要顯式調用std::basic_ofstream::close()
。
除了刷新用戶空間緩沖區,即flush()
,在底層文件描述符上調用close(2)
。 這取決於操作系統當時會發生什么,但很可能沒有任何事情發生在文件占用的實際存儲中。
將發生的情況是(如果文件描述符是該文件的該進程中的最后一個引用)與該文件關聯的文件條目將從該進程的打開文件表中刪除。 即釋放與進程相關的內核內存。
關閉當前與該對象關聯的文件,將其與流取消關聯。
任何掛起的輸出序列都將寫入該文件。
如果流當前未與任何文件關聯(即,沒有文件已成功打開),則調用此函數將失敗。
流的文件關聯由其內部流緩沖區保存:在內部,該函數調用rdbuf() - > close(),並在發生故障時設置failbit。
請注意,在銷毀ofstream對象時,任何打開的文件都會自動關閉。
來自: http : //www.cplusplus.com/reference/fstream/ofstream/close/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.