首頁 >後端開發 >C++ >您應該在 C 中手動關閉'ifstream”嗎?

您應該在 C 中手動關閉'ifstream”嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-26 00:32:09258瀏覽

Should You Manually Close an `ifstream` in C  ?

手動關閉ifstream是否可以增強RAII?

問題:

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn