パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

ファイルバッファ

BASICに限らず多くの言語でそうですが、ファイルの入出力をする際は、直接ディスク上の
ファイルに書き込んだりせず、ファイルバッファと呼ばれるメモリの領域を使用します。
プログラムする上で、この仕組みを知っておいたほうがいい場合がありますので、ファイル
バッファについてまとめておきます。

1 ファイルバッファ

ファイルバッファはメモリ上に設定された、プログラムとファイルの間で一時的にデータを蓄える
場所です。プログラムからファイルにデータを出力する、あるいはファイルからプログラムにデータ
を読み込む場合には、必ずいったんファイルバッファを仲介します。
例えば、PRINT #1 "A" などの命令文で、ディスク(フロッピーディスク、MO、ハードディスク
その他)にデータを書き込む場合、ディスクに直接"A"を書き込むのではなく、いったんファイル
バッファにデータを蓄え、蓄えたデータがある一定の量(通常1セクタ分、すなわち256バイトとか、
512バイトのことが多い)になったら、実際にディスク上のファイルに書き出すという動作をして
います。
つまり、ファイルに対して入出力命令を実行しても、実際にはバッファに対して入出力を行って
おり、ファイルに対する実際の入出力はバッファがいっぱいかどうかを自動判別して行われます。

ファイルの入出力を行う際には、各ファイル毎に専用のファイルバッファが割り当てられます。
具体的には、OPEN命令でファイルをオープンするときに、割り当てが行われます。
例えば、
OPEN "ABC" AS #2
としてファイルをオープンすると、ファイル"ABC"用に番号2番(#2)のファイルバッファが割り当てられる
ことになります。以後、このファイルへの入出力は、実際には2番のファイルバッファに対して行われ
ることになります(下記の(A)の動作)。シーケンシャルファイルの場合は、ファイルバッファがいっぱいに
なると、裏で自動的に実際のファイルに書き込んだり、ディスクから次の1セクタ分をファイルバッファに
読み込んだり、といったことが行われています(下記の(B)の動作)。

入出力命令 <-----(A)-----> ファイルバッファ <-----(B)----->Diskのファイル
(A)ファイルバッファへの書き込み、ファイルバッファからの読み込み
(B)ファイルバッファからDisk上の実際のファイルへの書き込み、あるいはDisk上のファイルから
  ファイルバッファへの読み込み

シーケンシャルファイルの場合では、(B)ファイル⇔ファイルバッファのやりとりは裏で自動的に行われて
いるのであまりファイルバッファの存在を意識しませんが、ランダムファイルの入出力ではプログラマが
ファイルとファイルバッファを明確に区別して操作することになります。
FIELD文では、ファイルバッファに対してフィールドを分割している ・・・(A)の動作
GETは、ファイルからレコードをファイルバッファに読み込んでいる・・・(B)の動作
PUTは、ファイルバッファの内容をファイルに書き込んでいるわけです・・・(B)の動作
ファイルバッファにデータを書き込む時は、LSET,RSETを使います・・・(A)の動作

2 ファイルバッファの個数

ファイルバッファは通常、OSの起動時にメモリ上に確保されます。その確保される個数は起動時の
設定によります。

例えば、古い話ですが、NECのPC-98シリーズでN88BASICで起動した場合、下図(これはNextという
エミュレータ上でN88Basicを動かしている)のように
How many files?
と聞かれますが、ここで聞かれているのが実は、確保するファイルバッファの数=同時にオープンできる
ファイル数になります。


今度はMS-DOSの例ですが、MS-DOSではConfig.sysという初期設定用のファイルに同時にオープン
するファイル数や、バッファのサイズを設定していました。
下の図では
FILES=30
で同時にオープンできるファイル数を30に設定しています。
バッファのサイズは下の例では設定の記述をしていませんのでデフォルト値で設定されることになります。
Config.sysの設定については、Config.sysをご参照下さい。

3 クローズ
上で見たように、確保するファイルバッファの数は有限なので、用済みになったファイルバッファは割り当て
から解放して、他のファイルの入出力に使えるようにしてあげなければいけません。この時に使うのが、
CLOSE命令です。CLOSEをすると、ファイルバッファにまだ残っていたデータを最後にファイルに出力して、
ファイルへの割り当てから解放します。

ファイルのクローズは非常に重要で、ファイルのクローズをせずにプログラムが終了すると、ファイルバッファ
に残っていたデータはファイルに書き出されずに失われてしまいます。また、それだけにとどまらず、ディスク
の管理情報に異常をもたらすこともありますので、ファイルのクローズは非常に重要です。
BASICの場合は、END,NEW,RUNといった命令でもファイルがクローズされるようになっているのが一般的
です。

よくあるのは、プログラムミスでプログラムが異常終了し、ファイルがクローズされずに残ってしまうケース
です。これはかなりの確率でディスクのクラッシュやFAT異常を引き起こすもとになります。
ファイルをクローズしないで、ディスクを交換した場合など、普通はOSがディスクの交換を検出して異常
な書き込みをしないようにプロテクトするはずですが、初期のころのCP/Mとか、ディスクの交換を検出
する機能がなかったのか、よくクローズし忘れたまま、ディスク交換してクラッシュさせてしまったことが
ありました。

TOP PAGE >Basic活用研究目次