1. ホーム
  2. c++

[解決済み】ifstreamを手動で閉じる必要がありますか?

2022-04-05 08:55:11

質問

を手動で呼び出す必要がありますか? close() を使用した場合 std::ifstream ?

例えば、コードでは

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 ファイルのクローズに使うのですか?

解決方法は?

NO

そのためにRAIIがあり、デストラクタにその仕事をさせるのです。 手動で閉じることに害はありませんが、それはC++の方法ではなく、クラスを使ったCでのプログラミングです。

関数の終了前にファイルを閉じたい場合は、常にネストされたスコープを使用することができます。

標準規格(27.8.1.5 クラステンプレート basic_ifstream)において。 ifstream を実装することです。 basic_filebuf 実際のファイルハンドルを保持するメンバです。 これは、ifstreamオブジェクトがデストラクトするときにも basic_filebuf . そして、標準規格(27.8.1.2)から、そのデストラクタはファイルを閉じます。

virtual ˜basic_filebuf();

エフェクト クラスのオブジェクトを破棄します。 basic_filebuf<charT,traits> . 呼び出し close() .