|
BASICコーナーは、この章が最終章です。最終章はランダムアクセスファイルについてです。ランダムアクセスファイルは、住所録など、データベースソフトのようなレコード管理を行うプログラムによく利用されます。
ファイルの基本は、
となります。
◆OPEN
ファイルをオープンします。
(共用モードの指定もありますがここでは省略します)
ファイル番号は、#1、#2、#3、と付けます。複数のファイルを同時に開ける事ができ、それぞれに別のファイル番号を付けて区別します。同時に13個まで開ける事が出来ます。「OPEN "TEST.DAT" AS #1」という感じで記述します。
◆CLOSE
ファイルをクローズします。
CLOSE #1 | #1のファイルをクローズ |
CLOSE #2,#3 | #2と#3のファイルをクローズ |
CLOSE | 全てのファイルをクローズ |
ファイルを扱う場合は最後に必ずクローズをして下さい。
◆FIELD
データフィールドの設定を行います。
FIELD ファイル番号,フィールド幅 AS 文字変数,フィールド幅 AS 文字変数,・・・ |
データフィールドとして例えば住所録を作る場合、
名前 | 20バイト | NAMAE$ |
会社名 | 40バイト | KAISYA$ |
郵便番号 | 8バイト | YUUBIN$ |
住所 | 60バイト | ADDRESS$ |
電話番号 | 15バイト | TEL$ |
とする場合、データフィールドの設定は、
100 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$ |
と書きます。
1行で書ききれない場合には、2行、3行と分ける必要があります。その場合は
100 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$
110 FIELD #1,68 AS DUMMY$,60 AS ADDRESS$,15 AS TEL$ |
のように、次の行の最初で、前の行までのフィールド幅の合計を書かないといけません。(20+40+8=68)これをDUMMY$としていますが、ここは、使っていない変数名であれば、どんな変数名でも構いません。ダミーなのでDUMMY$とかDUMMY1$とかDMY$とか、とする場合が多いようです。
上記で設定すると、名前が40バイト(漢字20文字)の場合には、後ろ20バイト(漢字10文字)分がカットされます。また、名前が10バイトだと、後ろに空白10バイト分が付加されることになります。
フィールド幅の合計は、標準状態で、256バイトとなっています。上記の場合の合計は、20+40+8+60+15=143となりますが、残り113バイトは半角空白文字で埋められます。半角空白文字が付けられるとファイルサイズもその分大きくなりますが、これを143バイトちょうどにしたい場合には、N88BASICを起動する際、
として起動すると、1レコード143バイトになり、余分な空白は付かないようになります。但し、ランダムアクセスファイルを複数扱う場合にはご注意下さい。
ランダムアクセスファイルは、データの読み書き単位をレコード単位で行います。1レコードは、FIELDで設定したデータフィールドの各変数に値を1つずつパックしたもの、と考えて下さい。例えば以下のようなイメージです。
レコード番号 | 名前 | 会社名 | 郵便番号 | 住所 | 電話番号 |
1 | 愛上男 | 株式会社ABC | 123-4567 | ○○県□□市 | 000-000-0000 |
2 | 柿久家子 | DEF有限会社 | 111-2222 | ○○県□□市 | 111-111-1111 |
3 | 佐志周世 | GHI Co.LTD | 333-4444 | ○○県□□市 | 222-222-2222 |
4 | 曽 他秩 | JKLM Co. | 555-6666 | ○○県□□市 | 333-333-3333 |
さて、上記は文字列だけですが、数値データを保存したい場合にはどのようにするか? それは、数値データを書き込みする際には、
整数値 | MKI$関数 |
単精度実数値 | MKS$関数 |
倍精度実数値 | MKD$関数 |
を使ってバイナリ文字列に変換してやります。
データを読み込んで、バイナリ文字列を数値として取り出す場合には、
整数値 | CVI関数 |
単精度実数値 | CVS関数 |
倍精度実数値 | CVD関数 |
を使って数値に変換してやります。
◆LSET/RSET
データを書き込む直前、データフィールドで設定した文字変数に値を代入する場合には、「NAMAE$="愛上尾"」のように普通の変数の代入をする事は出来ません。必ず、LSET又はRSETを使う必要があります。
LSET 変数名=文字列 | データフィールドで設定した文字変数に、左詰めで、文字列を代入します。(フィールド幅より少ない場合、文字の後(右側)に空白が付きます) |
RSET 変数名=文字列 | データフィールドで設定した文字変数に、右詰めで、文字列を代入します。(フィールド幅より少ない場合、文字の前(左側)に空白が付きます) |
なお、データを読み込んだ直後、変数の値を別の変数に代入する場合は、普通の変数の代入でOKです。
◆GET
ファイルから1レコード分のデータを読み込みます。
GET #1,1 | 第1レコードのデータを読み込みます |
GET #1,100 | 第100レコードのデータを読み込みます |
GET #1 | 次のレコードのデータを読み込みます |
数値の最小値は1、最大値は65535です。つまり住所録では、65535人分までのデータを1つのデータファイルに入れられる訳です。
◆PUT
ファイルへ1レコード分のデータを書き込みます。
PUT #1,1 | 第1レコードにデータを書き込みます |
PUT #1,100 | 第100レコードにデータを書き込みます |
PUT #1 | 次のレコードにデータを書き込みます |
数値の最小値は1、最大値は65535です。次のレコード以外、存在しないレコードへの書き込みは、行わないようにして下さい。PUTを行う前に、LSET/RSETで書き込む内容を指定しておいて下さい。
◆LOC
最後に読み書きを行ったレコード番号を取得します。
A=LOC(1) | ファイル#1の、現在のレコード番号を変数Aに入れます |
◆LOF
ファイルの最大レコード番号を取得します。
B=LOF(1) | ファイル#1の、最大レコード番号を変数Bに入れます |
書き込んだ合計レコード数を取得出来ます。
まずは書き込みサンプルプログラム例
10 OPEN "住所録.DAT" AS #1
20 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$
30 INPUT "名 前 =",A1$
40 INPUT "会社名 =",A2$
50 INPUT "郵便番号=",A3$
60 INPUT "住 所 =",A4$
70 INPUT "電話番号=",A5$
80 IF A1$="" THEN *FINE '名前に何も入れない場合、終了
90 '
100 LSET NAMAE$=A1$
110 LSET KAISYA$=A2$
120 LSET YUUBIN$=A3$
130 LSET ADDRESS$=A4$
140 LSET TEL$=A5$
150 PUT #1
160 GOTO 30
170 *FINE
180 CLOSE #1
190 END |
次に読み込みサンプルプログラム例
10 OPEN "住所録.DAT" AS #1
20 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$
30 MAXREC=LOC(1)
40 FOR I=1 TO MAXREC
50 GET #1,I
60 PRINT "レコード番号:";I
70 PRINT " 名 前 :";NAMAE$
80 PRINT " 会社名 :";KAISYA$
90 PRINT " 郵便番号:";YUUBIN$
100 PRINT " 住 所 :";ADDRESS$
110 PRINT " 電話番号:";TEL$
120 PRINT "−−−−−−−−−−−−−−−−−−−−"
130 NEXT I
140 CLOSE #1
150 END |
さて、それでは数値を扱いたい場合についても書いておきます。
例としてデータフィールドを以下のようにします。
名前 | 20バイト | NAMAE$ |
会社名 | 40バイト | KAISYA$ |
郵便番号 | 8バイト | YUUBIN$ |
住所 | 60バイト | ADDRESS$ |
電話番号 | 15バイト | TEL$ |
年齢 | 整数値 | TOSHI$ |
給料 | 単精度実数 | KYURYO$ |
退職金 | 倍精度実数 | TAISYOKU$ |
数値をバイナリ文字列に変換する場合、整数値は2バイト、単精度実数値は4バイト、倍精度実数値は8バイト、必要になります。この場合、FIELD設定は以下のようになります。
100 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$,2 AS TOSHI$,4 AS KYURYO$,8 AS TAISYOKU$ |
この場合の書き込みサンプルプログラム例
10 OPEN "住所録.DAT" AS #1
20 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$,2 AS TOSHI$,4 AS KYURYO$,8 AS TAISYOKU$
30 INPUT "名 前 =",A1$
40 INPUT "会社名 =",A2$
50 INPUT "郵便番号=",A3$
60 INPUT "住 所 =",A4$
70 INPUT "電話番号=",A5$
80 INPUT "年 齢 =",B1% '整数値
90 INPUT "給 料 =",B2! '単精度 変数名は「B2」だけでもOK
100 INPUT "退職金 =",B3# '倍精度
110 IF A1$="" THEN *FINE '名前に何も入れない場合、終了
120 '
130 LSET NAMAE$=A1$
140 LSET KAISYA$=A2$
150 LSET YUUBIN$=A3$
160 LSET ADDRESS$=A4$
170 LSET TEL$=A5$
180 LSET TOSHI$=MKI$(B1%)
190 LSET KYURYO$=MKS$(B2!)
200 LSET TAISYOKU$=MKD$(B3#)
210 PUT #1
220 GOTO 30
230 *FINE
240 CLOSE #1
250 END |
読み込みサンプルプログラム例
10 OPEN "住所録.DAT" AS #1
20 FIELD #1,20 AS NAMAE$,40 AS KAISYA$,8 AS YUUBIN$,60 AS ADDRESS$,15 AS TEL$,2 AS TOSHI$,4 AS KYURYO$,8 AS TAISYOKU$
30 MAXREC=LOC(1)
40 FOR I=1 TO MAXREC
50 GET #1,I
60 PRINT "レコード番号:";I
70 PRINT " 名 前 :";NAMAE$
80 PRINT " 会社名 :";KAISYA$
90 PRINT " 郵便番号:";YUUBIN$
100 PRINT " 住 所 :";ADDRESS$
110 PRINT " 電話番号:";TEL$
120 PRINT " 年 齢 :";CVI(TOSHI$)
130 PRINT " 給 料 :";CVS(KYURYO$)
140 PRINT " 退職金 :";CVD(TAISYOKU$)
150 PRINT "−−−−−−−−−−−−−−−−−−−−"
160 NEXT I
170 CLOSE #1
180 END |
※ 前回、
と起動してデータを作成してしまった後に、データフィールを追加してしまうと、フィールド幅の合計バイト数が上記の場合+14され「157」となります。そうなると、
と起動せねばなりません。更に、前回作成してしまったデータをそのまま利用する事が出来なくなります。例えば、旧バージョンから新バージョンへデータ変換を行うコンバートソフトを作成せざるを得なくなります。
データフィールドを色々修正する予定があるのなら、又は、プログラムのテスト段階では、フィールド幅の合計バイト数は、少し余裕を見て確保しておく事が望ましいです。
◆
以上でBASICの説明は終了ですが、他にも色々な機能がありますので興味のある方はマニュアルを参考にして下さい。また、BASIC言語の種類やPC機種によって、BASICの機能は種々様々ですので、本ページでは、基本的な部分の記述程度にとどめておきます。 |
|
バッチファイル
BASIC
1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
|