パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

Binaryファイルの入出力(入力)

今回は、Visual BasicでのBinaryファイルの入力について取り上げてみます。
BinaryモードでのファイルのopenやBinaryデータの書き込みについては
Binaryファイルの入出力(出力)」をご参照下さい。

(※)他のプログラム言語でのBinaryファイルの入出力
BASICでのバイナリファイルの読み込みは「DUMPプログラム作成」をご参照下さい。
アセンブラでのBinaryファイル読み込みは「DUMPプログラムの作成企画」「DUMPプログラムコード編
などをご参照下さい。


1 Binaryファイルの入力
Binaryモードでのファイルの入力(読み込み)には Get を使います。書式は以下の通りです。
Get #n, [rec], var
Binaryファイルのrecの位置のデータを変数varに読み込みます。

簡単なダンプテストプログラムの実験プログラムを作成してみましたので、実例をみてみましょう。
下図は前回のBinaryファイルの入出力(出力)で作成した new1.dat(&H01〜&HFFのバイナリーデータ)
を読み込んでダンプ表示してみた例です。

              (図1−VBDump)


上の例は、「Dump2」ボタンをおした時のものですが、そのコードの部分を以下に抜粋して載せます。
ファイル f$ をバイナリーモードでオープンして、
Byte型配列 b()に読み込み、16バイト毎に整列して表示(Text2.Text->右側のTextエリアです)する
プログラムです。

Dim b() As Byte        '配列bをByte型として宣言
Dim t$
Text2.Text = ""
f$ = File1.Path + "\" + Text1.Text   'f$ オープンするファイル名
Open f$ For Binary As #1
s = LOF(1)           'ファイルのサイズを変数sに読み込み
ReDim b(s)           '配列の大きさをs(ファイルサイズ)に変更
Get #1, , b()          '配列b()に読み込み
Close
      '以下は表示。Text2.Textにダンプ表示する。
t$ = t$ + " "
For i = 0 To 15
t$ = t$ + "0" + Hex$(i) + " "
Next
t$ = t$ + Chr$(13) + Chr$(10)
For i = 0 To s - 1
If (i Mod 16) = 0 Then
t$ = t$ + Right$("000" + Hex$(i), 4) + ":"
End If
t$ = t$ + Right$("0" + Hex$(b(i)), 2) + " "
If (i Mod 16) = 15 Then
t$ = t$ + Chr$(13) + Chr$(10)
End If
Next
Text2.Text = t$

少しだけ解説を加えておきます。
ファイルの読み込みの部分で
Get #1, , b()
となっています。このように記述すると配列 b()にファイル全体を一発で読み込むことができます。
C言語のポインタを理解している人なら、この記述の仕方にそう違和感はないと思いますが
旧Basicに慣れている人には、?かもしれません。
旧Basic流にコーディングすると、以下のようになります。
For i = 0 To s - 1
Get #1, ,b(i)
Next

b() と記述した場合は、特定の配列 b(i)をさすのではなく、配列b()の先頭アドレスをさします。
ここでは、詳述しませんので、アドレスを渡すということについて詳しく理解したい人はC言語のポインタを
勉強してみるといいと思います。
おじさんのC言語関連の兄弟サイトにある「再びポインタと配列」など参照してみて下さい。

上のプログラムでは 変数f$に読み込みたいファイル名を取得していますが、
読み込みたいファイル名を取得する方法については「ファイルへのアクセスの方法」、を参照して下さい。


2 文字列型変数では不具合が起こる

前回のBinaryファイルの出力の時も、ファイル入出力用の変数として文字列型を使うと、一部の値
の出力でうまくいかないことが確認されました。この不具合はファイルの入力の時でもやはり発生
します。
ダンプテストプログラムVBDumpの「DUMP」ボタンは文字列型変数での入力実験用です。
コードと、new1.dat を読み込んだ結果をのせますので、確認してみましょう。
配列 b() を1バイトの文字列型としている以外は、「Dump2」ボタンのコードと同じです。

Dim b() As String * 1
Dim t$
Text2.Text = ""
f$ = File1.Path + "\" + Text1.Text
Open f$ For Binary As #1
s = LOF(1)
ReDim b(s)
For i = 0 To s - 1
Get #1, , b(i)
Next
Close
t$ = t$ + " "
For i = 0 To 15
t$ = t$ + "0" + Hex$(i) + " "
Next
t$ = t$ + Chr$(13) + Chr$(10)
For i = 0 To s - 1
If (i Mod 16) = 0 Then
t$ = t$ + Right$("000" + Hex$(i), 4) + ":"
End If
t$ = t$ + Right$("0" + Hex$(Asc(b(i))), 2) + " "
If (i Mod 16) = 15 Then
t$ = t$ + Chr$(13) + Chr$(10)
End If
Next
Text2.Text = t$

new1.dat を読み込んで表示させた結果です。
&H81〜&H9F, &HE0〜&HFC(一部確認できませんが)が読み込めていません。
BinaryモードでのファイルへのアクセスはByte型変数を使うとういうのを原則とするのが良いでしょう。

Top page | Visual Basic&Excel活用研究目次