レコードを書く

ここまでで作った実身outputの大きさを見てみましょう。右クリック→実身操作→管理情報です。サイズのところが0バイトになっているはずです。作っただけで何も書き込んでいないわけですから当然ですね。さて、それでは書き込んでみましょう。rea_recがあったわけですから、wri_recがあります。でも、それだけではありません。

#include <sample.h>

VOID main(W argc, TC ** argv)
{
  LINK DestLink;
  WERR WErr, DestFD;
  ERR Err;
  B Buffer[123];

  WErr = get_lnk(L"結果", &DestLink, F_NORM);
  Err = cre_fil(&DestLink, L"output", NULL, 1, F_FIX);
  DestFD = opn_fil(&DestLink, F_WRITE, NULL);
  Err = apd_rec(DestFD, NULL, 0, 1, 0, 0);
  Err = see_rec(DestFD, -1, -1, NULL);
  Err = wri_rec(DestFD, -1, Buffer, sizeof( B ) * 123, NULL, NULL, 0);
  cls_fil( DestFD );
}

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

プログラムの解説

  1. Err = apd_rec(DestFD, NULL, 0, 1, 0, 0);
    実身はレコードの列からなります。今はまだ実身全体の器を作っただけですから、レコードの器を作ってあげなければなりません。
    1. 第二引数は書き込むデータを指すポインタですが、NULLにしておきます。
    2. 第三引数はレコードの大きさですが0にします。
    3. 第四引数はレコードのタイプです。1、つまりTAD主レコードにしてありますがここではテストなので何でもいいです。
    4. 第五引数はレコードのサブタイプですがやっぱりどうでもいいです。
    5. 第六引数は0にしましょう。
  2. Err = see_rec(DestFD, -1, -1, NULL);
    さあwri_rec…ではなく、see_recです。これはもうこの形で覚えておく方がいいでしょう。現在のレコードの最後に移動する方法です。wri_recの前にsee_recしましょう。
  3. Err = wri_rec(DestFD, -1, Buffer, sizeof( B ) * 123, NULL, NULL, 0);
    やっとwri_recです。書き込むごとにレコードの大きさは書き込んだ分だけ自動的に大きくなります。
    1. 第二引数を-1にするとレコードの最後に追加書き込みになります。
    2. 第三引数が書き込むデータへのポインタ
    3. 第四引数はその大きさです。
    4. 第五引数は実際に書き込んだバイト数が格納されますが、NULLにします。ところで、この部分の仕様書の記述は矛盾しています。まあ、とりあえずどうでもいいです。
    5. 第六引数によりレコードのサブタイプを変更できるようですがこれもNULLにします。
    6. 第七引数は0にします。

実行して、実際に実身の大きさが123バイトになっているかどうか確かめて下さい。

注記

試してはいませんが、レコードを追加するときに

  apd_rec(DestFD, Record, sizeof( B ) * 123, 1, 0, 0);

とすればレコードを作ると同時にデータを書き込めるはずです。しかし、ここで私が示したように、apd_recしてsee_recしてwri_recするという手順を踏むのが一般的だと思います。

復習

ここで出てきた関数はapd_recとsee_recとwri_recです。


Tamakoshi Hiroki
Last modified: Wed Nov 27 22:54:56 JST 2002