問題:
使用std::ifstream時,我們是否應該手動呼叫close()? ifstream 不是使用 RAII 來自動處理檔案關閉嗎?
範例程式碼:
std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close(); return buffer.str(); } throw std::runtime_exception("file not found"); }
是否需要呼叫 file.close() ? ifstream 不是採用 RAII 來關閉檔案嗎?
答案:
不是。
RAII 是設計出來的正是為了這個目的。允許析構函數執行其預期功能。手動關閉檔案不會造成任何損害,但它偏離了 C 約定,類似於使用類別在 C 中進行程式設計。
如果需要在函數結束之前關閉文件,可以使用嵌套作用域:
std::ifstream file(fileName.c_str()); { std::stringstream buffer; buffer << file.rdbuf(); } // scope ends; file closed here
根據標準(27.8.1.5,類別模板basic_ifstream),ifstream應該用basic_filebuf來實現包含真實文件句柄的成員。此成員確保當 ifstream 物件被銷毀時,它也會呼叫 basic_filebuf 析構函數。根據標準 (27.8.1.2),此析構函數關閉檔案:
virtual ˜basic_filebuf(); Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.
以上是您應該在 C 中手動關閉'ifstream”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!