AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
ランダムアクセスファイルBASIC(19)
BASICコーナーは、この章が最終章です。最終章はランダムアクセスファイルについてです。ランダムアクセスファイルは、住所録など、データベースソフトのようなレコード管理を行うプログラムによく利用されます。
 
ファイルの基本は、
ファイルのオープン
データフィールドの設定
読み込み・書き込み処理
ファイルのクローズ

となります。
 
◆OPEN
ファイルをオープンします。
OPEN "ファイル名" AS ファイル番号
(共用モードの指定もありますがここでは省略します)
 
ファイル番号は、#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を起動する際、
A>N88BASIC /S:143
として起動すると、1レコード143バイトになり、余分な空白は付かないようになります。但し、ランダムアクセスファイルを複数扱う場合にはご注意下さい。
 
 
ランダムアクセスファイルは、データの読み書き単位をレコード単位で行います。1レコードは、FIELDで設定したデータフィールドの各変数に値を1つずつパックしたもの、と考えて下さい。例えば以下のようなイメージです。
レコード番号名前会社名郵便番号住所電話番号
愛上男株式会社ABC123-4567○○県□□市000-000-0000
柿久家子DEF有限会社111-2222○○県□□市111-111-1111
佐志周世GHI Co.LTD333-4444○○県□□市222-222-2222
曽 他秩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
 
 
※ 前回、
A>N88BASIC /S:143
と起動してデータを作成してしまった後に、データフィールを追加してしまうと、フィールド幅の合計バイト数が上記の場合+14され「157」となります。そうなると、
A>N88BASIC /S: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
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.