シーケンシャルアクセスで入力または追加するためにファイルを開く場合、Input 関数を使用して指定された文字数を String 型 (または Variant 型) の変数に読み込めます。例えば、開いたファイルの長さを返す LOF 関数と共に Input 関数を使用し、ファイル全体 (最大 32,000 文字) を String 型の変数に読み込めます。
fileNumber% = FreeFile
Open "DATA.DAT" For Input As fileNumber%
fileContents$ = Input(LOF(fileNumber%), fileNumber%)
固定長または可変長のレコードではなく拡張非構造化文字列を書き込むには、テキストファイルをバイナリアクセス用に開き、Put ステートメントを使用します。次の Put ステートメントは、テキストファイルの前の内容を最初のバイトから上書きします。新しい文字列が前の内容より短い場合、Put 操作はファイルの終わりまでは上書きしません。
Open "DATA.DAT" For Binary Access Write As fileNumber%
Put fileNumber%, 1, fileContents$
ファイルが可変長レコードを含んでいる場合、Input #ステートメントおよび Write # ステートメントを使用してレコードの読み込みと書き込みを行います。Input # ステートメントはレコードを変数リストに読み込み、Write # ステートメントは変数リストからファイルに書き込みます。Write # ステートメントは、エントリを Input # ステートメントでも読み込めるように、エントリを区切ってフォーマットします。どちらの場合も、変数リストはユーザー定義のデータ型の変数のメンバです。
次の例では、SCORES.DAT から各レコードを可変長のユーザー定義のデータ型の変数に読み込みます。学生のスコアが 92 以上である場合、スクリプトはレコードを HISCORES.DAT に書き込みます。 プロセスは、EOF 関数が TRUE (-1) を返すまで続行されます。この値は、スクリプトが SCORES.DAT の終端に到達したことを示します。
Type Student
ID As Long
Name As String ' Variable-length string variable
Score As Single
End Type
Dim undergrad As Student
Sub WriteGoodStudents
Dim fileNum1 As Integer, fileNum2 As Integer
fileNum1% = FreeFile
Open "SCORES.DAT" For Input As fileNum1%
fileNum2% = FreeFile
Open "HISCORES.DAT" For Append As fileNum2%
While Not EOF(fileNum1%) ' Read until end of file.
Input #fileNum1%, undergrad.ID, undergrad.Name, undergrad.Score
If undergrad.Score > 92 Then
Write #fileNum2%, undergrad.ID, undergrad.Name, undergrad.Score
End If
Wend
Close fileNum1%
Close fileNum2%
End Sub
Print # ステートメントを使用してシーケンシャルテキストファイルに書き込むこともできますが、Print # はレコードを区切ってフォーマットしないため、Input # ステートメントで読み込めるかどうかは保証されません。
ファイルの書き込みにシーケンシャルアクセスを使用している場合は、ファイルを入力モードで開いたり (ファイルの以前の内容を置き換えます)、ファイルに追加したりできます。ファイルの途中でテキストの挿入や置き換えを行うことはできません。
Line Input # ステートメントを使用して、各行を String 型の変数に読み込むこともできます。Write # ステートメントと Print # ステートメントは、改行文字を各操作の終わりに入れるので、行は (複数行文字列を書き込まない限り) 通常は可変長レコードに対応します。
ランダムアクセスかバイナリアクセスでファイルを開くとき、ファイルの位置は 1 (先頭レコードまたはバイト) です。Get ステートメントを使用して変数にデータを読み込み、Put ステートメントを使用してデータを変数からファイルに書き込みます。変数はユーザー定義のデータ型の変数であっても構いません。各 Get と Put 操作で、ファイルの位置が順に進みます。Seek ステートメントを使って、ファイル位置を固定長レコード (ランダムアクセスの場合) またはバイト (バイナリアクセスの場合) に設定できます。 現在のファイル位置を取得するには、Seek 関数を使用します。
次の例は、固定長レコードとランダムアクセスを使用するように前の例を変更したものです。パフォーマンスが向上し、数値情報も (文字列としてではなく) 数値として格納されますが、固定長文字列は各レコードに多少の余分なスペースが必要になります。
Type Student
ID As Long
Name As String * 20 ' Fixed-length string variable.
Score As Single
End Type
Dim undergrad As Student
Sub WriteGoodStudents
Dim fileNum1 As Integer, fileNum2 As Integer
fileNum1% = FreeFile
Open "TESTSCORES.DAT" For Random Access Read As fileNum1% _
Len = Len(undergrad)
fileNum2% = FreeFile
Open "GOODSCORES.DAT" For Random Access Write _
As fileNum2% Len = Len(undergrad)
While Not EOF(fileNum1%) ' Read until end of file.
Get #fileNum1%,, undergrad
If undergrad.Score > 92 Then
Put #fileNum2%,, undergrad
End If
Wend
Close fileNum1%
Close fileNum2%
End Sub