#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;