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