program RandomAccessTextFiles;
uses sysutils;
type
TFieldType = (fName, fAge, fStreet, fTown);
TFieldTypeCharArray = array[TFieldType] of Char;
TDataStrings = array[TFieldType] of string;
const
FieldChars: TFieldTypeCharArray = ('!', '#', '$', '%');
TextFilename = 'data.txt';
function MakeData(aField: TFieldType; aString: String): String;
begin
Result:=FieldChars[aField] + aString;
end;
function GetDataFrom(const aString: String; out aFieldType: TFieldType): String;
begin
Result:='';
if (Length(aString) < 3) then
Writeln('GetData error: probable blank entry in ',aString)
else case aString[1] of
'!': aFieldType:=fName;
'#': aFieldType:=fAge;
'$': aFieldType:=fStreet;
'%': aFieldType:=fTown;
else WriteLn('GetData: error in first character ',aString[1],' of ',aString);
end;
Result:=Copy(aString, 2, Length(aString));
end;
procedure GetUserData(var ds: TDataStrings; var isFinished: boolean);
var
s: string;
ch: Char;
begin
isFinished:=False;
Write('Enter name: ');
ReadLn(s); ds[fName]:=MakeData(fName, s);
Write('Enter age: ');
ReadLn(s); ds[fAge]:=MakeData(fAge, s);
Write('Enter street: ');
ReadLn(s); ds[fStreet]:=MakeData(fStreet, s);
Write('Enter town: ');
ReadLn(s); ds[fTown]:=MakeData(fTown, s);
Write('(F)inish or (C)ontinue? ');
Read(ch);
isFinished:=(ch in ['f', 'F']);
WriteLn;
end;
procedure WriteData(aDataStrings: TDataStrings; var aFile: TextFile);
var
ft: TFieldType;
begin
for ft in TFieldType do
WriteLn(aFile, aDataStrings[ft]);
end;
procedure ShowData(const aRecordName: string);
var
s, name: string;
ft: TFieldType;
aFile: TextFile;
found: Boolean=False;
begin
AssignFile(aFile, TextFilename);
Reset(aFile);
while not EOF(aFile) do begin
ReadLn(aFile, s);
name:=GetDataFrom(s, ft);
if (ft = fName) and SameText(name, aRecordName) then
begin
found:=True;
WriteLn('Name: ',name);
ReadLn(aFile, s);
name:=GetDataFrom(s, ft);
if (ft = fAge) then
WriteLn('Age: ',name)
else Writeln('error');
ReadLn(aFile, s);
name:=GetDataFrom(s, ft);
if (ft = fStreet) then
WriteLn('Street: ',name)
else WriteLn('error');
ReadLn(aFile, s);
name:=GetDataFrom(s, ft);
if (ft = fTown) then
WriteLn('Town: ',name)
else WriteLn('error');
end;
end;
if not found then
Writeln('Could not find line in file with name: ',aRecordName);
CloseFile(aFile);
end;
var
txtFile: TextFile;
ds: TDataStrings;
dataEntryFinished: Boolean=False;
name: string;
ch: Char;
ft: TFieldType;
begin
WriteLn('Data entry');
WriteLn('----------');
AssignFile(txtFile, TextFilename);
Rewrite(txtFile);
repeat
for ft in TFieldType do
ds[ft]:='';
GetUserData(ds, dataEntryFinished);
WriteData(ds, txtFile);
until dataEntryFinished;
CloseFile(txtFile);
Writeln;
WriteLn('Data retrieval');
WriteLn('--------------');
repeat
WriteLn('Whose name do you want to retrieve?');
ReadLn(name);
ShowData(name);
Write('(C)ontinue or (Q)uit? ');
ReadLn(ch);
until (ch in ['Q','q']);
end.