home *** CD-ROM | disk | FTP | other *** search
- (* Program to demonstrate BlockRead and BlockWrite *)
- (* routines. *)
- Program BlockReadWriteDemo;
- Uses
- Crt;
- Type
- st20 = String[20];
- st40 = String[40];
- st80 = String[80];
-
- rcPersonInfo = Record
- stFirst : st20;
- stLast : st20;
- byAge : Byte
- end;
- Const
- coRecSize = sizeof(rcPersonInfo);
-
- Var
- wototalRecs : Word;
- rcTemp : rcPersonInfo;
- fiData : File;
-
- (***** Initialize Program Variables. *)
- Procedure Init;
- begin
- ClrScr;
- wototalRecs := 0;
- fillChar(rcTemp, coRecSize, 0);
- fillChar(fiData, sizeof(fiData), 0)
- end; (* Init. *)
-
- (***** Handle Program errors. *)
- Procedure ErrorHandler(byErrorNumber : Byte; boHalt : Boolean);
- begin
- Case byErrorNumber of
- 1 : Writeln('Error creating new data-File.');
- 2 : Writeln('Error writing Record to data-File.');
- 3 : Writeln('Record does not exist.');
- 4 : Writeln('Error reading Record from data-File.');
- 5 : Writeln('Error erasing Record in data-File.')
- end; (* Case byErrorNumber of *)
- if boHalt then
- halt(byErrorNumber)
- end; (* ErrorHandler. *)
-
- (***** Create new data-File to hold Record data. *)
- Function CreateDataFile(Var fiData : File) : Boolean;
- begin
- {$I-}
- reWrite(fiData, 1);
- {$I+}
- if (ioresult = 0) then
- CreateDataFile := True
- else
- CreateDataFile := False
- end; (* CreateDataFile. *)
-
- (***** Open data-File. *)
- Procedure OpenDataFile(Var fiData : File; stFileName : st80);
- begin
- assign(fiData, stFileName);
- {$I-}
- reset(fiData, 1);
- {$I+}
- if (ioresult <> 0) then
- begin
- if (CreateDataFile(fiData) = False) then
- ErrorHandler(1, True)
- else
- Writeln('New data-File ', stFileName, ' created.')
- end
- else
- Writeln('Data-File ', stFileName, ' opened.');
- wototalRecs := Filesize(fiData) div coRecSize
- end; (* OpenDataFile. *)
-
- (***** Add a Record to the data-File. *)
- Procedure AddRecord(woRecNum : Word; Var rcTemp : rcPersonInfo);
- Var
- woBytesWritten : Word;
- begin
- if (woRecNum > succ(wototalRecs)) then
- woRecNum := succ(wototalRecs);
- seek(fiData, (pred(woRecNum) * coRecSize));
- blockWrite(fiData, rcTemp, coRecSize, woBytesWritten);
- if (woBytesWritten = coRecSize) then
- inc(wototalRecs)
- else
- ErrorHandler(2, True)
- end; (* AddRecord. *)
-
-
- (*** PART 2 *****)
-
- (***** Get a Record from the data-File. *)
- Procedure GetRecord(woRecNum : Word; Var rcTemp : rcPersonInfo);
- Var
- woBytesRead : Word;
- begin
- if (woRecNum > wototalRecs)
- or (woRecNum < 1) then
- begin
- ErrorHandler(3, False);
- Exit
- end;
- seek(fiData, (pred(woRecNum) * coRecSize));
- blockread(fiData, rcTemp, coRecSize, woBytesRead);
- if (woBytesRead <> coRecSize) then
- ErrorHandler(4, True)
- end; (* GetRecord. *)
-
- (***** Erase the contents of a data-File Record. *)
- Procedure EraseRecord(woRecNum : Word);
- Var
- woBytesWritten : Word;
- rcEmpty : rcPersonInfo;
- begin
- if (woRecNum > wototalRecs)
- or (woRecNum < 1) then
- begin
- ErrorHandler(3, False);
- Exit
- end;
- fillChar(rcEmpty, coRecSize, 0);
- seek(fiData, (pred(woRecNum) * coRecSize));
- blockWrite(fiData, rcEmpty, coRecSize, woBytesWritten);
- if (woBytesWritten <> coRecSize) then
- ErrorHandler(5, True)
- end; (* EraseRecord. *)
-
- (***** Display a Record's fields. *)
- Procedure DisplayRecord(Var rcTemp : rcPersonInfo);
- begin
- With rcTemp do
- begin
- Writeln;
- Writeln(' Firstname = ', stFirst);
- Writeln(' Lastname = ', stLast);
- Writeln(' Age = ', byAge);
- Writeln
- end
- end; (* DisplayRecord. *)
-
- (***** Enter data into a Record. *)
- Procedure EnterRecData(Var rcTemp : rcPersonInfo);
- begin
- Writeln;
- With rcTemp do
- begin
- Write('Enter First-name : ');
- readln(stFirst);
- Write('Enter Last-name : ');
- readln(stLast);
- Write('Enter Age : ');
- readln(byAge)
- end;
- Writeln
- end; (* EnterRecData. *)
-
- (***** Obtain user response to Yes/No question. *)
- Function YesNo(stMessage : st40) : Boolean;
- Var
- chTemp : Char;
- begin
- Writeln;
- Write(stMessage, ' (Y/N) [ ]', #8#8);
- While KeyPressed do
- chTemp := ReadKey;
- Repeat
- chTemp := upCase(ReadKey)
- Until (chTemp in ['Y','N']);
- Writeln(chTemp);
- if (chTemp = 'Y') then
- YesNo := True
- else
- YesNo := False
- end; (* YesNo. *)
-
- (***** Compact data-File by removing empty Records. *)
- Procedure PackDataFile(Var fiData : File);
- begin
- (* This one I'm leaving For you to Complete. *)
- end; (* PackDataFile. *)
-
- (***** PART 3 *****)
- (* Main Program execution block. *)
- begin
- Init;
- OpenDataFile(fiData, 'TEST.DAT');
- rcTemp.stFirst := 'Bill';
- rcTemp.stLast := 'Gates';
- rcTemp.byAge := 36;
- DisplayRecord(rcTemp);
- AddRecord(1, rcTemp);
- rcTemp.stFirst := 'Phillipe';
- rcTemp.stLast := 'Khan ';
- rcTemp.byAge := 39;
- DisplayRecord(rcTemp);
- AddRecord(2, rcTemp);
- GetRecord(1, rcTemp);
- DisplayRecord(rcTemp);
- EraseRecord(1);
- GetRecord(1, rcTemp);
- DisplayRecord(rcTemp);
- EnterRecData(rcTemp);
- AddRecord(1, rcTemp);
- DisplayRecord(rcTemp);
- close(fiData);
- if YesNo('Erase the Record data-File ?') then
- erase(fiData)
- end.
-
-