這個問題: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