質問: fopen( "test.txt", "r" ); としたとき、fopenの裏側では何が行われているのでしょうか? ファイルポインタ(とかファイルハンドル)とは一体何なんでしょうか? 読み取り、書き込みは、物理メディアに対しての物理的動作をイメージできますが、 オープン、クローズは何もイメージできません。 オープン、クローズとは何でしょうか?
回答: 「概念」として理解したいのであれば、裏側をあまり意識しない方が理解できると思います。 裏側にしても、ハードディスクへの読み書きから順番に理解していくのは相当技術力が必要だと思います。 土地に倉庫を建てるという例でOSあたりを中心に概念的に説明すると。 * だだっぴろい土地がある状態→未フォーマットのハードディスク * 土地を(たとえば)1m四方に区切り、たとえば4行5列目、といったらどこの部分を示すかがわかるようにすること→物理フォーマット * OSさんから倉庫(ファイル)をいくつか建てる依頼がくる前提で、個々の倉庫の識別方法や、倉庫の大きさ(たとえば45平米)、IDなどで指示できるように整理し、実際にどこの区画にどういう大きさで立てたかを管理できるように定義すること→論理フォーマット(ファイルシステムの作成) といった前準備がまず発生します。ついでファイルの作成になりますが、 1. お客さん(アプリ)が倉庫をこういう倉庫名(ファイル名)で、このくらいの容量(たとえば36平米)の倉庫を建ててほしいと倉庫管理業者(OS)に依頼 2. 倉庫管理業者は、論理フォーマットの表を元に、ここの区画にこういう形(たとえば4 x 9で)で建ててほしいと倉庫業者(デバイスドライバ)に依頼。3つ目の倉庫なので管理番号は3、倉庫名はお客さんからの指示の名称をつけて管理(倉庫名は変更されることもあるので)、空きスペース36平米といった管理作業を行う。 3. 倉庫業者は建設業者(ハード)に依頼して倉庫を建てる。 といった作業が発生します。 ファイルをオープンする場合は 1. お客さんが倉庫名(ファイル名)を指定して、借用している倉庫にものを置きたい。倉庫名はfile1ですと倉庫管理会社に依頼(fopen発行) 2. 倉庫管理会社が、受付担当者をアサインしました。以降今回の倉庫への搬入はこの担当者にお願いしますと返答(fopenの返答としてfpを返却) 3. では4平米の荷物をお願いしますと依頼(write) 4. 受付担当者(OS)は、スペースを確認した上で、荷物を倉庫に置くよう、倉庫業者(デバイスドライバ)に依頼。その際、倉庫名から対応表を使って割り出した倉庫識別番号を渡す。 5. 倉庫業者は倉庫識別番号と空きスペース情報を元に、倉庫に荷物を持っていく 6. 建設業者(ハード)は、倉庫内に、たとえば2x2でおくか、4x1で置くかなどを考え、実際に倉庫に荷物を置く。 7. 引き続き、追加で荷物を置いたり、既存の荷物の搬出を行わない場合は、今回のやりとりの完了をお願いする(fclose) といった感じになると思います(少し抜けもれあると思いますが) これらを実際にはプログラムで行うので、プログラムでどう実装されているかはまた別のレベルの理解が必要になります。 URLはダミーです