簡體   English   中英

std :: ofstream :: close()實際上做了什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM