ブロック単位的処理

BASICではバイト処理に関するメソッド・関数などは皆無である。バカなBASIC屋がそんなものに手を出したりしないようにというMicrosoftの温情によるものである(笑)。

BASICのバイト処理の不便さはブロック単位での処理にある。たとえば、ファイルからいま何バイトを読み出したのかを知ることもできない。これは特に、最終ブロックで切実な問題を発生させる。処理の論点もこの最終ブロックの処理をどうするかという点に絞られる。

この点、たとえば、C言語に次のようなfread関数がある。これと同じような「戻り値」を返す関数をBASICで作ることができないかが問題になる。

要点

とはいうものの、こういうブロック単位的な処理が必要になる場面はそう多くはない。今のところは、BinaryText.frm だけでしか使っていない。

貧弱なBASICで、こういうものに対する方法は次の2つになる。
  1. 上のfreadと同じような動作をする関数をBASICで自作する。
  2. freadのような関数が必要になりそうな場合はそれを避けて別の方法を考える。

労力対効果でいえば、(2)の方法になるだろう。vba_0206、vba_0209などを参照。BinaryText.frmもこのパターンである。特に不便を感じないかぎりはこの簡易な方法でいくのもいいかもしれない。

その場合でも、場当たり的にならないようにある程度の方針は決めておくべきである。
  1. ブロック単位的処理をする場合のバッファのサイズは今のところ512バイトにする。これを指定バッファとする。

  2. 問題は最終ブロックの判定と指定バッファに満たないサイズのファイルの取り扱いである。

  3. 最終ブロックは通常は指定バッファよりサイズが小さい。

  4. Fread1,Fread2はなんとか正常に動作するが、方法がダサい。
    問題はFread3のパターンである。これが理論的にはスマートな方法だがやや面倒である。

  5. Fread3ではファイルの現在位置の判断を2回行うことで解決できる。
    すなわち、ファイルの終端を判定するためと最終ブロックを判定するために分けることである。

  6. このFread3でうまくいった。使うのはこのパターンになる。これをスマートに関数化したものがFileBlockReadWriteである。

要点

さて、この方法をどういうところで使うか。それは考えておくべきである。
現在のところは、ファイルの先頭から末尾までを機械的に読み込む場合を想定している。しかし、それだけでおさまらない場合もある。たとえば、以前やった画像の抽出などでは、ファイルの途中から何バイトかを取り出すというもので、このパターンには当てはまっていない。しかし、これもブロック単位的処理が適する例である。この点も考えておく必要がある。




FileBlockReadWriteの使用例(ipc_0131)

SOURCE
ファイルのブロック単位的処理(vba_0280)
ファイルを1バイトの過不足もなく読み出すことができる。




Unicode,UTF-8,UTF-16,Big,Little,Endian,LE,BE,Shift_JIS,SJIS,CR,LF,CRLF,byte,bit,word,CSV,BOM,Encode,Decode,ANSI, Binary,Open,Byte,Get,Put,Input,InputB,Asc,AscB,AscW,Chr,ChrB,ChrW,Hex,Mod,EOF,LOF,Loc,FreeFile,ReDim,Encoding, Left,LeftB,Right,RightB,Mid,MidB,Len,LenB,InStr,InStrB,FileSystemObject,FSO,CreateTextFile,OpenTextFile, バイナリ,テキスト,文字列,文字コード,16進コード,16進文字列,変換,ビッグ,リトル,エンディアン,ユニコード,改行,サンプル, バイト,ビット,ヘキサ,2進数,16進数,読み込み,書き込み,エンコード,デコード,解析,変換,判定,判別,バイナリエディタ, 全角,半角,カタカナ,ひらがな,漢字, Excel,VBA,