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

目次へ戻る