2013-04-28 137 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()

相關問題