レコードを読む

実身を開く方法はとりあえず分かりました。つまりUNIXにおけるopenに相当するものです。次はreadしましょう。しかし、TADはレコードが並んでいるものでしたから、レコードごとに読むことになります。レコードを読み込む関数はrea_recです。関連する関数としてsee_recとfnd_recがあります。

#include <sample.h>

VOID main(W argc, TC ** argv)
{
  LINK SrcLink;
  WERR WErr, SrcFD, Type;
  W SearchMode = F_FWD, Number, Size;
  UH Subtype;

  WErr = get_lnk(L"test", &SrcLink, F_NORM);
  SrcFD = opn_fil(&SrcLink, F_READ, NULL);
  while( 0 <= (Type = fnd_rec(SrcFD, SearchMode, 0xffff, 0, &Number)) ) {
    if ( SearchMode == F_FWD ) SearchMode = F_NFWD;
    WErr = rea_rec(SrcFD, 0, NULL, 0, &Size, &Subtype);
    printf("number: %d, type: %d, size: %d, subtype: %d\n",
	   Number, Type, Size, Subtype);
  }
  cls_fil( SrcFD );
}

プログラムを置いておきます

プログラムの解説

このプログラムは、コンソールコマンドfsと似たことをします。実身を読むのプログラムに追加した部分について解説します。

  1. while( 0 <= (Type = fnd_rec(SrcFD, SearchMode, 0xffff, 0, &Number)) ) {
    fnd_recは、SrcFDで指定される実身の中のレコードを探してそこに移動する関数です。SearchModeは探す方向を指定します。include/file.hに定義があります。レコードは単に並んでいるだけですから、前から探したり後ろから探したりします。例えば次のようなものが使えます。
    #define    F_FWD		0x0000		/* 前向きサーチ 		*/
    #define    F_NFWD		0x0001		/* 前向きサーチ(次から) 	*/
    三番目の引数は、どの型のレコードを探すかのマスクです。レコードタイプ1或いは8のレコードを探したい場合は
    1 << 1 | 1 << 8
    と指定します。四番目の引数はどのサブタイプを持つレコードを探すかのマスクです。0を指定するとサブタイプを考慮せず全部探しにいきます。五番目の引数には、探したレコードが実身の中で前から数えて何番目なのか、その番号が入ります。fnd_recの返り値はレコードの型ですが、エラーが起こったりそれ以上レコードがない場合には負の値が返ってくるのでそのときにはループを抜けます。
  2. if ( SearchMode == F_FWD ) SearchMode = F_NFWD;
    F_FWDは「ここ」から後ろに向かって探します。つまり、F_NFWDにして「次」から後ろに向かって探すようにしないといつまで経っても「ここ」のレコードが返ってきてしまいます。
  3. WErr = rea_rec(SrcFD, 0, NULL, 0, &Size, &Subtype);
    さて、ではレコードを読んでみましょう。ただし、ここではレコードの中身は読まず、レコードの大きさやサブタイプだけを取得することにします。
    1. 第一引数: 読み込み元のファイルディスクリプタ。
    2. 第二引数: (レコードの現在位置+この値)から読み込む。
    3. 第三引数: 読み込んだ内容を格納する領域。NULLにすると読み込みません。代わりにレコードの大きさが第五引数に格納されます。というより、最初にこのようにしてレコードの大きさを知っておかないと、どのくらいの大きさの格納領域を作ればいいのか分からないわけです。
    4. 第四引数: レコードの大きさを知りたい場合にはここを0にしましょう。0より大きい場合は、読み込むバイト数を指定することになります。
    5. 第五引数: ここにレコードの大きさが入ります。
    6. 第六引数: ここにレコードのサブタイプが入ります。
  4. printf文
    取得した情報をコンソールに出力します。これはいいですね。

復習

ここで出てきた関数はfnd_recとrea_recです。


Tamakoshi Hiroki
Last modified: Wed Nov 27 00:34:14 JST 2002