#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 = I64Get("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 = I64Get("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(CharGet);
        '\n';
        if (ch == 'R') ReadAcct;
        if (ch == 'W') WriteAcct;
    }
    while (ch != CH_SHIFT_ESC && ch != CH_ESC);
}

DatabaseDemo;