シーケンシャルファイル

シーケンシャルファイルは通常のテキストファイルです。ファイルの各文字は、テキスト文字、または改行などを示すその他の ASCII 文字です。文字は、ファイルを開くときに指定する文字セット中にあります。既定では、これがプラットフォーム固有の文字セットです。

シーケンシャルファイルは、テキスト行または文字列のレベルでのアクセス (つまり、一連のレコードに分割されないデータへのアクセス) を提供します。ただし、シーケンシャルファイルは、数値が文字として書き込まれるので、バイナリデータには適していません。

シーケンシャルファイルを開く

シーケンシャルファイルは、入力、出力、追加の 3 つのモードのいずれかで開けます。すでに開いているファイルを別のモードで開くには、いったん閉じる必要があります。

構文は次のとおりです。

Open fileName [For {Input | Output | Append} ] As fileNumber [Len = bufferSize] [Charset = MIMECharsetName]

Input はファイルへの読み込み専用を意味し、Output は書き込み専用を意味します。Append はファイルの終りから開始される書き込み専用のアクセスです。3 つのシーケンシャルモードすべてでのアクセスは、一度に 1 行ずつ行います。使用されていない fileNumber を取得するには、FreeFile 関数を使用します。

bufferSize は、ディスクに対して読み書きを行う前に内部バッファにロードする文字数です。これは、パフォーマンスを向上させる機能です。バッファが大きいほど、入出力は速くなります。ただし、バッファサイズが大きいほど、メモリが必要になります。 シーケンシャルファイルの既定のバッファサイズは 512 バイトです。

文字セットを指定するのが MIMECharsetName です。既定では、プラットフォーム固有の文字セットとなります。ただし、UTF-16 または UTF-8 バイト順のマーク (BOM) がある場合は、BOM 文字セットが使用されます。また OS/400® では、BOM がない場合は CCSID が使用されます。有効な MIME 文字セット値の一覧については、「MIME 文字セット名」を参照してください。

シーケンシャル入力で開くことができるファイルは既存のファイルだけです。存在しないファイルを開こうとするとエラーになります。出力モードや追加モードでファイルを開くときにファイルが存在しない場合、自動的に作成されます。

シーケンシャルファイルに書き込む

Print # または Write # ステートメントを使用すると、出力モードまたは追加モードで開いたシーケンシャルファイルに変数の内容を書き込めます。

Print に渡すパラメータは、文字列や数式でも構いません。数値は自動的に文字列に変換されます。

次の例では、Var1 と Var2 の内容を idFile で番号付けしたファイルに書き込みます (Var1 と Var2 の内容はステートメント内にカンマがあるためタブで区切られます)。

Print #idfile, Var1, Var2

Write # ステートメントは、式の組をカンマで分けて文字列の両端に二重引用符を付けることにより、Input # ステートメントと互換性のある出力を生成します。

以下に例を示します。

Dim supV As Variant, tailV As Variant
supV = 456 
tailV = NULL
Write #idFile, "Testing", 123, supV, tailV

上記のステートメントは、次の行を IdFile と番号付けしたファイルに出力します。

"Testing",123,456,#NULL#
注: True、False、NULL は、文字列の「#True#」、「#False#」、「#NULL#」として格納されます。

シーケンシャルファイルから読み込む

シーケンシャルファイルからデータを読み込むには、入力モードでファイルを開きます。次に、Line Input # ステートメント、Input # ステートメント、Input 関数を使用して、データをファイルから変数に読み込みます。

Line Input # は、ファイルから 1 行のテキストを行末まで読み込みます。行末 (EOL) は、返される文字列には含まれません。

次の例は、ファイルを 1 行ずつ行末まで読み込みます。Print ステートメントは行を表示し、EOL シーケンスを追加します。

Do Until EOF(idFile)
   Line Input #idFile, iLine
   Print iLine
Loop

Input # ステートメントは、Write # ステートメントで処理され書き込まれたデータを読み込みます。

以下に例を示します。

idFile という番号を持つファイルに次の行が含まれているとします。

"Testing",123,456,#NULL#

次のステートメントで、"Testing" を liLabel に、123 を infA に、456 を supA に、値 NULL を tailV に読み込みます。

Dim liLabel As String, tailV As Variant
Dim infA As Integer, supA As Integer
Input #idFile, liLabel, infA, supA, tailV

Write # や Input # を使用してシーケンシャルファイルを操作することが多い場合は、ランダムファイルを使用することをお勧めします。ランダムファイルは、レコード化したデータに適しています。

Input 関数は、シーケンシャルファイルからデータを読み込みます。Input 関数は、読み込む文字数を引数として処理し、その文字列を返します。Input$ 関数は、呼び出し元に文字列を返します。Input 関数は、Variant 変数を返します。

次の例では、一度にファイル全体を文字列変数に読み込みます。

' LOF returns the length of the file in characters.
Dim fulFile As String
fulFile = Input$(LOF(idFile), idFile)