(仮称)十進BASICでは,CHARACTER INPUT文を利用してファイルをバイト単位で読むことが可能です。全体がメモリ上に収まる程度の長さのファイルであれば,(仮称)十進BASICでN88-BASIC(MS-DOS版)で作成したランダム・ファイルの操作は可能です。
ファイルと文字列をバイト単位で扱うため,各プログラム単位の先頭に
OPTION CHARACTER BYTE
を書いておきます。そうすると,CHR$関数とORD関数とで文字と数値との相互変換が可能になります。
256バイトをファイルから読み込む外部副プログラムを定義します。
2000 EXTERNAL SUB RecordRead(#1,s$) 2010 OPTION CHARACTER BYTE 2020 FOR i=1 TO 256 2030 CHARACTER INPUT #1:s$(i:i) 2040 NEXT i 2050 END SUB
この副プログラムは,#1に指定された経路から256バイトを読み込んでs$に代入します。
もう1つ,s$のm文字目からのn文字を左詰めでt$に置き換える外部副プログラムを定義しておきます。
3000 EXTERNAL SUB Replace(s$, m, n, t$) 3010 IF LEN(t$)>n THEN CAUSE EXCEPTION 999 3020 REM n≦10と仮定 3030 LET a$=t$ & " " 3050 LET s$(m:m+n-1)=a$(1:n) 3060 END SUB
LEN(t$)がnより大きいときには呼び出し元でextype=100999の例外が発生します。必要に応じて(呼び出し元に)例外状態処理を書いてください。なお,切り詰めで代入したいときは,3010行を削除してください。その場合は例外状態処理は不要です。1から999までの例外番号は利用者専用で,他の要因でこの例外番号の例外は発生しないことが保証されています。(上の例では999を使用)。
主プログラムにも忘れずに
1000 OPTION CHARACTER BYTE
を書いておきます。
また,外部副プログラムを使うためのDECLARE文も書いておきます。
1010 DECLARE EXTERNAL SUB RecordRead, Replace
ファイルは表示形式で開きます。つまり,読みたいファイルがA:ABC.DATであれば,
1100 OPEN #1:NAME "A:ABC.DAT"
の形でOPEN文を実行します。
ファイルのレコード数が不明な場合は,
1110 ASK #1:FILESIZE n
を実行してファイルのサイズを調べます。結果はバイト数です。
1120 LET n=INT(n/256)
を実行すればnはレコード数になります。
次に,全レコードを収めるための配列を用意します。
1130 DIM s$(n)
なお,レコードを追加する可能性がある場合は大きめに宣言してください。この形のDIM文を実行したときは,あとで配列を大きくすることはできません。
そして次のようにRecordReadを呼び出します。
1200 FOR i=1 TO n 1210 CALL RecordRead(#1,s$(i)) 1220 NEXT i
添字付き変数s$(i)の10文字目からの8文字をt$で置き換えたいときは,
CALL Replace(s$(i), 10, 8, t$)
とします。
また,レコードの追加が必要な場合は,
LET s$(n+i)=REPEAT$(" ",256)
のようにして長さが正確に256のレコードを用意します。
配列s$に対して必要な操作が終了したら,PRINT文の末尾にセミコロンを書いて,余分な改行コードを出力しないようにして書き戻します。
1900 ERASE #1 1910 FOR i=1 TO n 1920 PRINT #1: s$; 1930 NEXT i 1940 CLOSE #1 1950 END
ただし,安全性を重視する場合は,一旦,別名で書き出したのち,元のファイルを削除して,新規に書き出したファイルを元の名前に改名することを推奨します。