#define DB_FILENAME     "~/DataBaseDemo.BIN"
#define DB_ACCT_MAX     100
#define DB_ACCT_BLKS    1

class Acct
{//Use <CTRL-l> to help generate formats.
  U8 name[32] format "$DA-P,LEN=32,A=\"Name:%s\"$\n";
  U8 addr[64] format "$DA-P,LEN=64,A=\"Addr:%s\"$\n";
  U8 pad[DB_ACCT_BLKS*BLK_SIZE-64-32];
};

U0 InitDatabase()
{ //Write new contiguous file
  CFile *f=FOpen(DB_FILENAME,"w",DB_ACCT_MAX*DB_ACCT_BLKS);
  FClose(f);
}

U0 WriteAcct()
{
  CFile *f;
  Acct a;
  I64 acctnum;

  acctnum=GetI64("Acct #",-1);
  if (0<=acctnum<DB_ACCT_MAX) {
    MemSet(&a,0,BLK_SIZE);
    if (DocForm(&a)) {
      f=FOpen(DB_FILENAME,"w+");
      FBlkWrite(f,&a,acctnum*DB_ACCT_BLKS,DB_ACCT_BLKS);
      FClose(f);
    }
  }
}

U0 ReadAcct()
{
  CFile *f;
  Acct a;
  I64 acctnum;

  acctnum=GetI64("Acct #",-1);
  if (0<=acctnum<DB_ACCT_MAX) {
    f=FOpen(DB_FILENAME,"r");
    FBlkRead(f,&a,acctnum*DB_ACCT_BLKS,DB_ACCT_BLKS);
    FClose(f);
    ClassRep(&a);
  }
}

U0 DatabaseDemo()
{
  I64 ch;
  if (!FileFind(DB_FILENAME))
    InitDatabase;
  do {
    "$GREEN$R$FG$ead acct, $GREEN$W$FG$rite acct or $GREEN$<SHIFT-ESC>$FG$:";
    ch=ToUpper(GetChar);
    '\n';
    if (ch=='R') ReadAcct;
    if (ch=='W') WriteAcct;
  } while (ch!=CH_SHIFT_ESC && ch!=CH_ESC);
}

DatabaseDemo;