VB6でバイナリファイルを読み書きする時の注意点
まだ、Visual Basic 6.0の仕事をやってます。で、ちょっとハマったので書いておく。
バイナリのファイルを読むんだけども、1レコードの大きさは可変長なので、1バイトづつ読み取ってレコードバッファにくっつけていって組み立てるようなコードを書いた。で、ここでVB6でバイナリファイルを扱うなんて事をやったことがない人(俺)の勘違いが発覚。
Dim CharcterBuf As String * 1 Dim RecordBuf As String Dim fh As Long DIm BytePos As Long fh = Freefile(0) Open "hogefuga.bin" For Binary Access Read As #fh BytePos = 1 Get #fh,BytePos,CharacterBuf Do While Not (IsEndOfRecord(RecordBuf) Or EOF(fh)) RecordBuf = RecordBuf & CharacterBuf BytePos = BytePos + 1 Get #fh,BytePos,CharacterBuf Loop
こう書くと、なんとデータによってはファイルに書かれている内容をそのまま読み取ることができない。勝手に違うコードに読み替えられる場合がある。「なんじゃこりゃあああああ」と絶叫してMSDN調べたら、文字列型はUnicodeの読み換えとかが発生するからバイナリはだめだよと。まあ、言われてみれば至極当然。で、書き換えると、こんな。
Dim CharcterBuf As Byte Dim RecordBuf() As Byte Dim fh As Long DIm BytePos As Long fh = Freefile(0) Open "hogefuga.bin" For Binary Access Read As #fh BytePos = 1 Get #fh,BytePos,CharacterBuf Do While Not (IsEndOfRecord(RecordBuf) Or EOF(fh)) ReDim Preserve RecordBuf(BytePos - 1) RecordBuf(BytePos - 1) = CharacterBuf BytePos = BytePos + 1 Get #fh,BytePos,CharacterBuf Loop
あと関連の関数やサブルーチンがStringでI/FしてたりするのをByte Arrayでやるように書き換える。Open文に「読み替えしない」みたいなオプションあれば、楽だったのにな。まあ、文字列型なんだからしょうがないか。
コードをちょっと修正。配列のインデックスはゼロ相対でした。