ホームページ >バックエンド開発 >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()を呼び出しますか? RAII は、ファイルのクローズを自動的に処理するために 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 を採用していませんか?

答え:

いいえ、

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。