###Abstract
ファイル操作の原理とファイルポインタの意味について、まとめておこうと思う。
###ファイルの読み書きについての整理
まず、磁気記憶媒体からメモリへのファイルの読み込み、およびメモリへのファイルへの書き込みの原理について、以下の例を基に整理したいと思う。
想定:磁気記憶媒体に保存されたファイル『data.csv』を扱う。
ユーザーの指示:ファイル『data.csv』を追記モード(aモード)で開け
→メモリが、『data.csv』のファイルサイズ、50バイト、に相当する作業領域(領域Aとする)を確保する。
領域Aの先頭アドレスの値を114514番とすると、そこから50個先の114563番までが領域Aに相当する。
この114514番~114563番の50個のアドレス値をそれぞれ要素にもつ配列を生成し、
それをユーザーにより宣言された変数 $data に代入。
→磁気記憶媒体に保存された『data.csv』がメモリの領域Aに読み込まれる。
以下、ユーザーはポインタ変数 $data を介して領域Aに読み込まれた『data.csv』にアクセスし、
様々なファイル操作を行うことになる。
ファイルポインタとは
ファイル"ポインタ"というからには、ポインタの一種である
ファイルポインタとは何か、を説明すると、以下のようにいえる:
ファイルポインタとは、
ファイルの内容を読み込んだり、新しく何かを書き込んだりする際に、
読み込む部分を指定したり、新たに書き始める起点を指定したりするための指定子の役割を持つ変数である。部分の指定は、ファイルを読み込んだメモリ領域のアドレス値を使っておこなう。
上の『data.csv』の例では、ユーザーが何らかのファイル操作を命令すると、
データ全体(のアドレス値)が格納されているポインタ変数 $data の配列の中から、
操作の目的に沿ったある一つの要素を取り出し、それをファイルポインタとして、ファイルポインタ変数 $fp に格納する。
たとえば『data.csv』をfopenの追記モードで開くと、ファイルの最後尾から書き始めるために、
ポインタ変数 $dataの最後の要素である114563番が(fopenの戻り値として)取り出され、
それが$fpに格納される。そして、この状態で
fwrite($fp,"こんにちは");
を実行すると、114564番から先の領域に、データ『"こんにちは"』のデータサイズ分だけ新たなメモリ領域(領域Bとする)が確保され、
その領域Bにデータ『"こんにちは"』が格納され、
ポインタ変数 $data の配列には、領域Bのアドレス値が新たに要素に追加される。
###以上