質問:
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 サイトの他の関連記事を参照してください。