3.ファイル処理
プログラムによっては,大量のデータを入出力したり,あるいは計算の過程で途中の計算結果をファイル
(フロッピーディスクやハードディスクなどの記憶装置・媒体を通常ファイルと呼ぶ)に書き出したり,読み込んだり
する必要が生ずる。このようなデータをデータファイルと呼ぶが,これにはシーケンシャルアクセスファイル,ランダム
アクセスファイルおよびバイナリアクセスファイル(ファイルをレコード単位としてではなく,書式化されていないバイト列
として扱う。詳細については,Quick Basic Handbook p140〜145参照)の3種類がある。
以下ではこれらのデータファイルの取り扱いについて説明する。
(1)シーケンシャルアクセスファイル
1つのレコードがCR/LF(キャリジリターン・ラインフィードと呼び,区切り記号として1 レコード毎に挿入
される)で終了する1行のテキストとしてファイルに格納される。例えば,数値でも各桁ごとにASCII文字
(テキスト形式)で表した文字列として保存する。したがって,一般のスクリーンエディタを用いて表示や変更
ができる。
可変長レコードとして扱われる。各レコードのフィールド長も可変長として扱われる。
詳しくは,Quick Basic Handbook p120〜130参照のこと。
1 レコードは次のように通常複数のフィールドから成り,レコードの末尾に区切りとしてCR/LFが入る。
フィールド,フィールド,フィールド,フィールド,フィールド......CR/LF
・ファイルの入出力:
データをファイルに出力する或いはファイルからデータを入力するためには,使用の前後で必ずファイルの
OPENとCLOSEを行う必要がある。
(例)ファイルからの入力(読み込みモード)
OPEN <”ファイル名”> FOR INPUT AS #<ファイル番号>
INPUT #くファイル番号>,く変数名>
CLOSE #<ファイル番号>
注) ファイル名:
ファイル名の指定には,ドライブ名やパス名も指定できる。また,DOSは大文字と小文字を
区別しないのでファイル名もそれに従い,区別されない。
ファイル番号:
1〜255の整数で指定し,ファイルに固有の番号を割り当てる。同時にOPENしている他の
ファイルと同じ番号を割り当てることは出来ない。
CLOSE:
ファイルをCLOSEすることにより,ファイルバッファーに格納されている全てのデータをファイル
ヘ書き込み,割り当てられていたファイル番号を開放する。なお,ファイル番号を省略した場合
あるいはBASICのプログラムが終了した場合には全てのファイルがCLOSEされる。
(例)ファイルヘの出力(書き出しモード;ファイルの作成)
OPEN <”ファイル名”> FOR OUTPUT AS #<ファイル番号>
WRITE #<ファイル番号>,<データを保存している変数名>
CLOSE #<ファイル番号>
ただし,・既存のファイルと同じ名前のデータファイルをOPENして書き込む場合,既存のデータファイル
を削除してから新しいレコードを書き込むので注意。
・既存のデータファイルに追加して出カするには,OPEN文をAPPENDモードに変更する。
OPEN <”ファイル名”> FOR APPEND AS #<ファイル番号>
・データの書き出し方法は,WRITE #文の他に次の方法もある。
PRINT #<ファイル番号〉,<データを保存している変数名>
両者の違いは次の通りである。
WRITE #文 〜レコードの各フィールドがカンマで区切られる。
文字列式は” ”で囲まれる。
PRINT #文 〜PRINTで画面に表示されるのと同じイメージでファイルに書き出される。
即ちカンマで区切られない。” ”でも囲まれない。
注) PRINT #文で格納されたデータをINPUT #文で読み込むときには,データに
よっては予期せぬエラー(Quick Basic Handbook p126参照)を生ずることがある。
したがって,支障の無い限りWRITE #文を使用した方が無難である。
・データの読み込み方法は,INPUT #文の他に次の方法もある。
LINE INPUT #文 〜フィールド単位で読み取らないで,ファイル中の1行のテキスト,
即ちCR/LFで区切られた1レコード単位で文字変数に読み込む。
(例) LINE INPUT #1,X$(i)
INPUT$ #文 〜シーケンシャルファイルからデータを書式化されていないバイト列として
読み込む。あるいはバイナリファイル(ASCII形式でないファイル)を読み
込むときに使用する。
(例) X$=INPUT$(100,#1)…・ファイル番号1のファイルから100バイト
読み出して文字変数X$に代入する。
(2)ランダムアクセスファイル
ランダムアクセスレコードは固定長で定義され,同様に各フィールドも固定長で定義される。データが固定長で
あるため,フィールドを区切るカンマやレコード間のCR/LFが無い。数値データの場合はバイナリ形式で保存する
のでASCII形式で保存するシーケンシャルファイルよりも一般的にディスクスペースを節約できる。
以下にランダムアクセスファイルのデータの入出力手順について示す。
・各レコードのフィールドを定義
・ファイルをランダムアクセスモードでOPENし,各レコードの長さを指定
・レコードに新しいデータを保存しファイルに格納。あるいはファイルから読み込み
(a)フィールドおよびレコードの定義
TYPE〜END TYPE ステートメントを用いる。
(例) ’Definition
of Record Type
丁YPE Rtype ...Rtypeは,構造体の名前
Name AS STRING 30 ...この場合Nameは文字型変数であるが,
Age AS INTEGER その後ろに$は付けない。
Salary AS SINGLE
END TYPE
’Declare
RecordVar as the variable with Rtype
DIM RecordVar AS Rtype
...RecordVarは,文字列と整数型と単精度実数型のデータから成るユーザー
定義型の複合データ型変数として定義される。これはレコードを格納するため
の変数。
(b)ファイルのOPENとレコード長の指定
ランダムアクセスレコードは固定長であるため,各レコードの長さをプログラム内で
指定しなければならない。
(例) TYPE〜END TYPEで定義したレコードに対するレコード長の指定
OPEN ”EMPLOYEE.DAT” FOR RANDOM AS #1 LE=LEN(RecordVar)
RANDOMには,シーケンシャルファイルのような書き出しモードと読み込み
モードの区別がない。
(c)レコードの格納
(例) INPUT ”Name” ;RecordVar.Name
INPUT ”Age” ;RecordVar.Age
INPUT ”Salary” ;RecordVar.Salary
PUT #1,レコード番号,RecordVar
(読み込みの場合:GET #1,レコード番号,RecordVar)
(d)ファイルのクローズ
(例) CLOSE #1
目次へ戻る