ファイルから読み込んでファイルに書き込む

シーケンシャルアクセスで入力または追加するためにファイルを開く場合、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 の終端に到達したことを示します。

Demonstrates pulling records from Scores.txt and putting in HiScores.txt

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 # ステートメントは、改行文字を各操作の終わりに入れるので、行は (複数行文字列を書き込まない限り) 通常は可変長レコードに対応します。

注: 改行は、すべてのプラットフォームで chr(10) または chr(13) を意味するわけではありません。改行は、行の終端を示すために使用される文字または文字列です。この文字は、Chr(10) や Chr(13) の場合もあれば、それ以外の場合もあります。これは、改行の実際の値がプラットフォームに依存するためです。
注: Line Input # ステートメントは、現在のプラットフォームに適した行終端文字を処理します。ファイルの書き込みと読み込みがそれぞれ別のプラットフォームで行われる場合は、行の終端が正しく処理されないこともあります。

ランダムアクセスかバイナリアクセスでファイルを開くとき、ファイルの位置は 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