ファイルハンドルの管理とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > ファイルハンドルの管理の意味・解説 

ファイルハンドルの管理

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/14 06:48 UTC 版)

RAII」の記事における「ファイルハンドルの管理」の解説

別の例として、ファイルオープンクローズ挙げる従来標準Cライブラリ使って直接リソース管理する書き方だと以下のようになる。 #include #include #include FILE* openFile(const char* fileName, const char* mode) { FILE* fp = std::fopen(fileName, mode); if (!fp) { throw std::runtime_error("Failed to open file!"); } return fp;}void writeLine(FILE* fp, const char* strLine) { assert(fp); const int ret = std::fprintf(fp, "%s\n", strLine); if (ret < 0) { throw std::runtime_error("Failed to write data on file!"); }}void function2A() { FILE* fp1 = NULL; FILE* fp2 = NULL; try { fp1 = openFile("test1.txt", "a"); fp2 = openFile("test2.txt", "a"); // ファイル書き込み行なう。 writeLine(fp1, "Test line for file#1."); writeLine(fp2, "Test line for file#2."); // ファイル使い続ける。 // 何か問題起こって関数抜け場合return前に fclose()忘れずに呼ばなければならない。 // 明示的にファイル閉じ必要があるstd::fclose(fp1); std::fclose(fp2); } catch (...) { // 獲得したリソースがあれば返却する。 if (fp1) { std::fclose(fp1); } if (fp2) { std::fclose(fp2); } throw; // 例外再送出。 }} 一方RAII利用した場合は以下のようになるclass FileWrapper { FILE* m_fp;public: FileWrapper(const char* fileName, const char* mode) : m_fp(std::fopen(fileName, mode)) { // ファイルハンドルでデータメンバーを初期化。 if (!m_fp) { throw std::runtime_error("Failed to open file!"); } } ~FileWrapper() { assert(m_fp); std::fclose(m_fp); } void writeLine(const char* strLine) { assert(m_fp); const int ret = std::fprintf(m_fp, "%s\n", strLine); if (ret < 0) { throw std::runtime_error("Failed to write data on file!"); } } // コピー禁止とする。所有権移動サポートしない。private: FileWrapper(const FileWrapper&); FileWrapper& operator=(const FileWrapper&);};void function2B() { FileWrapper file1("test1.txt", "a"); file1.writeLine("Test line for file#1."); FileWrapper file2("test2.txt", "a"); file2.writeLine("Test line for file#2.");} // 関数途中で return したり、例外スローされたりしても、RAII 変数属すブロック抜けた時点確実にファイルハンドル閉じられる標準C++ライブラリでは、抽象化されたファイルストリーム管理用のRAIIクラスとして、std::basic_fstreamが用意されている。 FileWrapperクラスではFILE*をカプセル化したが、RAII真髄有限資源ならば何でも同様に管理できることにある。そしてRAIIでは、関数(やその他ブロック)を抜けるときに適切に資源破棄されることが保証される。なお、FileWrapperクラスコンストラクタファイル開けなければ例外投げるため、インスタンス生成されていれば内包するファイルハンドルは常に利用可能であると仮定してよい。 RAII使わない場合例外発生するとある問題生じる。複数資源確保する際、それぞれの確保の間に例外投げられたら、catchブロックではどれを解放すべきか分からなくなってしまう(通常確保されていない資源解放することはできない)。function1Aやfunction2Aのように、初期値無効見なすことにして二段初期化したり、try-catchブロック重ねていったりするなど、状況に応じてコード適切に書いていかなければ安全性得られない。function1Bやfunction2BのようなRAIIならばこれにも対処できる変数メンバ変数も含む)が構築されたときとは逆順破棄され、また完全に構築された(内部例外投げられずにコンストラクタ実行された)オブジェクトのみが破棄されるので問題起こらない。これはプログラム資源(またはそれに類するもの)の管理から逃れることができるようになったということである。RAIIクラス定義する手間はかかるが、いくつも関数RAIIクラス使っていれば、コードの再利用により全体的にコード単純化し良いプログラムにする手助けとなる。また、副次効果としてビジネスロジック記述集中することができるようになる。 なお、function1Aやfunction2AはJavaのようなRAIIでない言語での資源管理使われるイディオム似ているJavaのtry-finallyブロック資源確実な返却実行するポイント提供するが、都度try-finallyブロック適切に破棄処理を書かなければならず、プログラマ負担がかかる。

※この「ファイルハンドルの管理」の解説は、「RAII」の解説の一部です。
「ファイルハンドルの管理」を含む「RAII」の記事については、「RAII」の概要を参照ください。

ウィキペディア小見出し辞書の「ファイルハンドルの管理」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ファイルハンドルの管理」の関連用語

ファイルハンドルの管理のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ファイルハンドルの管理のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのRAII (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS