ランダムファイルは、同じ長さの一連のレコードから構成されます。レコードは、Integer 型や String 型などのスカラーデータ型、またはユーザー定義のデータ型に対応させられます。各レコードは、そのデータ型のメンバに一致するフィールドに分割できます。
構文は次のとおりです。
Open fileName For Random As fileNumber [Len = recordLength]
recordLength はファイル内の各レコードの長さです。既定の長さは 128 バイトです。
開こうとするファイルが存在しない場合は、新しく作成されます。
ランダムファイルのレコードはすべて同じ長さでなければならないので、型の文字列は固定長にする必要があります。ファイルレコードにコピーされた文字列がレコード長よりも短いと、レコードの残りの部分は変更されずに残されます。また、文字列がレコードよりも長いと、書き込まれるときにレコード長に合わせて切り取られます。
ユーザー定義型の文字列フィールドも固定長にします。可変長の文字列を使用する場合は、Open ステートメントの Len 部分で、ファイルに書き込む文字列の最大の長さを格納するために十分な長さを指定します。また、Len 関数では、レコードの長さの確実な値は返されないので、レコードの長さを予測する必要があります。さらに、Get ステートメントや Put ステートメントでレコード番号を省略すると、レコード間を移動できません。
ユーザー定義型を使用すると、複合レコードを定義できます。
以下に例を示します。
Type emploRec
id As Integer ' Integers are 2 bytes long
salary As Currency ' Currency is 8 bytes
hireDate As Double ' Dates are also 8 bytes
lastName As String * 15 ' Fixed-length string of 30 bytes
firstName As String * 15 ' Fixed-length string of 30 bytes
End Type
型の長さは、実行時に Len 関数を使用して決定できます。
例えば、このレコードは 78 バイトの長さになるので、Open ステートメントで Len = 78 と指定します。
Dim recLen As Integer, idFile As Integer
Dim recHold As emploRec
idFile = 1 ' The file number to use for
' this file
recLen = Len(recHold) ' The record length for this file
Open "DATA.DAT" For Random As idFile Len = recLen
ランダムファイルに書き込むには Put ステートメントを使用します。Put ステートメントは、ファイル番号、レコード番号、書き込みデータが設定された変数の 3 つのパラメータを受け取ります。Put ステートメントを使用してレコードの追加や置き換えを行うことはできますが、削除することはできません。ランダムファイルのレコードを置き換えるには、そのレコード番号を使用します。
以下に例を示します。
Dim recNum As Integer
recNum = 5
' Replace record 5 with the contents of recHold.
Put idFile, recNum, recHold
ランダムファイルに新しいレコードを追加するには、ファイルのレコード数より大きなレコード番号を使用します。例えば、5 つのレコードを持つファイルにレコードを追加するには、6 の位置を使用します。
ランダムファイルのレコードを置き換えるには、新しいファイルを作成して、そこに元のファイルから有効なレコードをコピーします。元のファイルを閉じて、Kill ステートメントで削除します。その後、Name ステートメントを使用して、新しいファイルに元のファイルと同じ名前を付けます。また、各レコードの位置を 1 ずつ上げながら移動して、レコードに上書きしていくこともできます。この方法の問題点は、ファイルの最後に重複したレコードが残ることです。
以下に例を示します。
Dim tempRec As emploRec
For I = recNum To lastRec - 1
Get idFile, I + 1, tempRec
Put idFile, I, tempRec
Next I
ランダムファイルのデータを変数に読み込むには、Get ステートメントを使用します。
次の例は、idFile の番号を持つファイルのレコード番号 5 を変数 recHold に読み込みます。
' The record number to retrieve from the file
Dim recNum As Integer
recNum = 5
' The variable to read into
Dim recHold As emploRec
Get idFile, recNum, recHold