ランダム・アクセス・モードで開くファイルまたは装置を指定します。
構文:
Open filename for Random [Access access_type] [Lock lock_type] as [#]filenum
[Len = record_length]
パラメタ:
filename
開くファイル名
access_type
ファイルに対して、読むか、書くか、あるいは両方かを、指定します。
lock_type
ファイルが開いている間、使用を、ロックします。
filenum
オープン・ファイルに関連づける、未使用のファイル番号
record_length
ファイルに使用される記録のサイズ
記述:
filenum で指定した、ファイルか装置を、記録サイズ
record_length で、バイナリ・データを読む、または、書くために、開きます。
ファイルが存在しないと、新しいファイルが作成されます。ファイルが存在すると、ファイルに存在するどんなデータも
Open で保存されます。
ファイル・ポインタは、
Open で、ファイルの始め、レコード No.1で、初期化されます。
ファイル操作は、
record_length バイトのステップで、ファイルの位置を動かします。
このファイル・モードは、ファイルの、全記録を読むか、または書くのに、ユーザが定義した
Type バッファ変数を使用します。
バッファ変数は、いくつかの項目を含めるために使用します。
Get # と
Put # で、データはバイナリ・モードで保存されます。これは、FreeBASICが使うものと同じ内部形式です。
filename は、目標の OS に適合するファイル名をもたらす文字列表現にする必要があります。ワイルドカードは使えません。
経路を与えないと、現在のディレクトリでファイルを捜します。
Access_type -
デフォルトで、
Random モードは、ファイルの読み書きの両方ができます。
Access タイプを指定する場合は、下のいずれかになります。
- Read - ファイルは入力だけのために開かれます。
- Write - ファイルは出力だけのために開かれます。
- Read Write - ファイルは入出力のために開かれます。(デフォルト)
Lock_type は、他のプロセス(ユーザかスレッド)のためにファイルをロックする方法を指定します。以下の中の 1 つになります。
- Shared - 他のプロセスは自由にファイルにアクセスできます。
- Lock Read - 同時に、読むためにファイルを開くことができません。
- Lock Write - 同時に、書くためにファイルを開くことができません。
- Lock Read Write - 同時に、他のプロセスでファイルを開くことができません。
ロックタイプを指定しないと、ファイルは、そのプログラム他のスレッドのために Shared になります。他のプログラムに対しては、Lock Read Write になります。
Lock と Unlock は、ファイルの部分へ、一時的にアクセス制限するのに使用できます。
filenum は、現在開いている他のどのファイルにも使われていない、有効な FreeBASIC ファイル番号(1〜255の範囲)です。
ファイル番号は、以降のファイル操作で使うファイルを、特定します。
空いているファイル番号は、
FreeFile 関数を使って見つけることができます。
record_length は、ファイル・ポインタが、各個々の
Get と
Put のために動かすバイトの量です。それは、データを
Get と
Put するときに使われるバッファ変数のサイズに合わなければなりません。
record_length を省略すると、デフォルトで、128 になります。
例:
'' この例は、テスト・ファイルを生成して、次に、
'' ファイルから読みながら、ランダムな指示に従って記録を表示します。
Type Entry
slen As Byte
sdata As String * 10
End Type
Dim u As Entry
Dim s As String
Open "testfile" For Random As #1 Len = SizeOf(Entry)
'' あらかじめ定めたデータで、9 つのレコードを書出します。
For i As Integer = 1 To 9
Read s
u = Type( Len(s), s )
Put #1, i, u
Next
Data ".,-?!'@:", "abc", "def"
Data "ghi", "jkl", "mno"
Data "pqrs", "tuv", "wxyz"
'' ユーザーに、索引番号を指定してもらって、記録を表示します。
Do
Dim i As Integer
Input "レコード番号(1 〜9)を入力して下さい。それ以外で終了します。: ", i
If i < 1 Or i > 9 Then Exit Do
Get #1, i, u
Print i & ": " & Left( u.sdata, u.slen )
Print
Loop
Close #1
Type ScoreEntry Field = 1
As String * 20 Name
As Single score
End Type
Dim As ScoreEntry entry
'' 偽の適当な量のファイルを生成する
Open "scores.dat" For Random Access Write As #1 Len = SizeOf(entry)
For i As Integer = 1 To 10
entry.name = "Player " & i
entry.score = i
Put #1, i, entry
Next
Close #1
'' 登録したものを読み込んで表示する
Open "scores.dat" For Random Access Read As #1 Len = SizeOf(entry)
For i As Integer = 1 To 10
Get #1, i, entry
Print i & ":", entry.name, Str(entry.score), entry.score
Next
Close #1
Sleep
Type UDT 'ユーザ定義型を作成
slen As Byte
sdata As String * 10
End Type
Dim i As Integer
Dim s As String
Dim u As UDT
Dim ff As UByte
Dim fpos As Integer
ff = FreeFile
fpos = 10
Open "testfile.dat" For Random As #ff Len=SizeOf(UDT)
For i = 1 To 9
Read s
u = Type
( Len(s), s )
Put #ff, i, u
Next
Do
Input "レコード番号(1〜9)を入力して下さい。それ以外で終了します。:
", i
If i < 1 Or i > 9 Then Exit Do
Get #1, i, u
Print i & ":
" & Left
( u.sdata, u.slen )
Print
Loop
Close #ff
End 0
Data ".,-?!'@:", "abc", "def"
Data "ghi", "jkl", "mno"
Data "pqrs", "tuv", "wxyz"
QBからの違い:
-
ユーザー定義型(UDT)内の、動的または固定長文字列については注意が必要です。Type の警告を参照してください。
-
キーワード Field は、Type で、UDTを詰め込むことを指定することに使用できるだけです。
参考: