旧来の方法を模した(open,close,inputなどを使う)方法と、APIを使う方法がある。

旧来の方法

  • 昔のBASICを知っている人はこれを使いたいと思うだろうが、実は互換性に乏しい。
  • エラーが起きたときに適切に処理する方法が用意されていないので注意が必要。

シーケンシャル

これで書き込み。

open "test.dat" For output As #1
write #1, "test",1,"a"
close #1
test.datはこのようになる。
test,1,a[cr][lf]
読み込むときは、型をあわせて

Dim a$,b$,c$,i,j,k
open "test.dat" For input As #1
input #1, a$,i,c$
close #1
とやればok。
書き込みにprint #1,a$,b,c$とするとカンマの代わりにタブになる。;で区切ればスペースになるらしい。
test[tab]1[tab]a[cr][lf]
inputはカンマでデータを区切るのでa$にtest[tab]1[tab]aが代入される。
printの時は明示的にカンマを書き込んでやる必要がある。

文字列にカンマが含まれているとき。どうするか?
文字列をダブルコーテーションでくくる。
write #1, "aaa,bbb"
write #1, Chr$(34)+"aaa,bbb"+Chr$(34), 428
または
write #1, Ex"\qaaa,bbb\q",428

ランダムファイル

ランダムファイルは、固定長レコード(=決まった大きさの単位)でしか読み書きできない。
つまり、1文字のデータでも10文字のデータでも同じだけファイルを消費する。
レコードの大きさはfield命令で設定する。


#N88BASIC
Dim a$,b$,c$,i,j,k

open "rndtest.dat" As #1
field #1, 64
a$="abcde"
put #1, 1,a$
a$=Str$(1.4145)
put #1, 2,a$
close #1

open "rndtest.dat" As #1
field #1, 64
get #1, 2, a$
close #1

Print a$
ランダムファイルは、文字列でしか読み書きできない。だから数値は何らかの方法で文字列に変換しなければならない。
昔のBASICにはMKI$とかCVIとか数値⇔文字列の変換する関数が用意されていたがABでは自力で作らないといけない。

シーケンシャルファイルVSランダムファイル

シーケンシャルファイルの特徴は次の通り
  • データをギッチギチに詰め込める
  • 文字列と数値をそのまま書き込める

ランダムファイルの特徴は次の通り
  • ファイルの任意の位置のレコードを読み書きできる

API


用心点は、APIを使うファイル操作はBASICのファイル操作とちゃう事。
BAISCのようにEOF関数は無い。
EOF関数はないのでファイルサイズから計算する、ファイルヘッダのファイルサイズを
参照しデータ読み取り範囲を指定やらなんやらする。
もう一つの方法は、ReadFile()のバッファへ格納した値の戻り値を見て、0が現れたらEOFと
判断する事。

ReadFile()はバイナリファイル、テキストファイルを区別せん。
バイナリファイルも扱うことが出来るちゅうわけや。バイナリファイルを扱う場合はAPIを使うとええ。
BASIC互換のファイル関数はバイナリを扱うことはややこしい.

CreateFile(),ReadFile()の構造体の引数をNULLにする場合はByVal 0、またはByVal NULLを指定。

CreateFile(ReadFile)


ファイルを開きデータを読む場合はAPIの、CreateFile関数でファイルを開きファイルハンドルをうぇる。
その後にReadFile関数でデータを読む。

#console

Dim hfile As HANDLE
Dim fname(63) As Byte
Dim buff(31) As Byte

Dim rlen As DWord
Dim rtn As DWord

'ファイル名を指定
lstrcpy(fname,"c:\tmp\a1.txt")

'ファイルハンドルを開く
hfile=CreateFile(fname,GENERIC_READ,NULL,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

'ファイルハンドルエラー処理
if hfile=INVALID_HANDLE_VALUE then
print "FILE OPEN ERROR"
end
End If

'ファイルを1byte読み込む
rtn=ReadFile(hfile,buff,1,VarPtr(rlen),ByVal NULL)

'読み込んだデータを表示
print buff(0),Chr$(buff(0))
print rlen
print rtn

CloseHandle(hfile)

a1.txt
abc def

CreateFile(WriteFile)


ファイルに書き込む場合はAPIの、CreateFile関数でファイルを開き、WriteFile関数で
データを書き込む。

#console

Dim hfile As HANDLE
Dim fname(63) As Byte
Dim buf(31) As Byte
Dim rlen As DWord
Dim rtn As DWord

lstrcpy(fname,"c:\tmp\b1.txt")

hfile=CreateFile(fname,GENERIC_WRITE,NULL,ByVal NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)

lstrcpy(buf,"hello")

'buf配列から5byte分のデータをファイルへ書き込む
rtn=WriteFile(hfile,buf,5,VarPtr(rlen),ByVal NULL)

CloseHandle(hfile)


b1.txt
hello

IniFile