PROGRAM RT; (** ** PROGRAM TITLE: Random Files IO ** ** WRITTEN BY: Raymond E. Penley ** DATE WRITTEN: 11 June 1980 ** ** WRITTEN FOR: Users of Pascal/Z **) LABEL 99; {place to go when all done} CONST terminal = '/EOF/EOF/EOF/EOF/EOF'; ID = 'RAND.TST'; TYPE Custype = record name : STRING 20; next : ^cust end; STR255 = STRING 255; Storetype = file of custype; VAR count, (* Record counter *) IX, Rcd : INTEGER; CTRLE, (* My End_of_file flag on INPUT *) CTRLZ : CHAR; (* CP/M eof of file marker *) XEOF, (* User supplied EndOfFile flag *) EOFS, (* Flag for CP/M eof marker *) done : BOOLEAN; Customer : custype; Store : Storetype; FUNCTION INDEX(X,Y: STR255): INTEGER; EXTERNAL; Procedure SCROLL; VAR ix : 1..25; jx : INTEGER; begin For ix:=1 to 25 do begin writeln; For jx:=1 to 600 do {dummy}; end; end; Procedure CLEAR; VAR ix : 1..25; begin For ix:=1 to 25 do Writeln; end; Procedure PAUSE; VAR cix : char; begin write('Type return to continue ');READLN(cix); end; FUNCTION SIZE(VAR fx : Storetype): INTEGER; VAR ix : integer; begin RESET(ID,fx); ix := 1; READ(fx,Customer); XEOF := INDEX(Customer.NAME,'/EOF/') <> 0; While NOT XEOF do begin ix := ix + 1; READ(fx,Customer); XEOF := INDEX(Customer.NAME,'/EOF/') <> 0; end; SIZE := ix - 1; end{---of SIZE---}; (*$P+ [turn on symbolic output]*) BEGIN CLEAR; CTRLZ := CHR(26); Customer.name := '--------------------'; Customer.next := nil; writeln(' ':15, 'PASCAL/Z FILE I/O Demo'); writeln(' ':15, 'File I/O on a NON Text file'); writeln;writeln; writeln(' ':15,'Creating file "RAND.TST"'); { File RAND.TST will be created sequentially but may be accessed either randomly or sequentially } REWRITE(ID,Store); FOR IX:=1 TO 20 DO begin Customer.NAME[ix] := CHR(ix+64); WRITE(Store,Customer); Writeln;(*---simple scroll here---*) end; {---NOW mark the End_Of_File---}; Customer.name := terminal; WRITE(Store,Customer); WRITELN; WRITELN(' ':15,'---TEST ONE - SEQUENTIAL READING---'); count := SIZE(Store); RESET(ID,Store); WRITELN('INITIALLY AFTER A RESET EOF(Store) = ', EOF(Store) ); for ix:=1 to 5000 do {dummy}; For ix := 1 to count do begin READ(Store,Customer); XEOF := INDEX(Customer.NAME,'/EOF/') <> 0; EOFS := (Customer.NAME[1]=CTRLZ); writeln; IF NOT EOFS THEN WRITELN( ix:3, ': ', Customer.NAME); writeln(' ':5,'XEOF = ', XEOF, ' ':5,'EOFS = ', EOFS ); End; PAUSE; SCROLL; WRITELN(' ':15,'---TEST TWO - RANDOM READING---'); WRITELN;writeln; writeln('Enter <-1> to quit'); RESET(ID,Store); DONE := FALSE; REPEAT WRITELN; WRITE('Enter RECORD to be DISPLAYED ');READ(Rcd); If Rcd=(-1) then begin Done:=true;goto{exit}99 end; If Rcd<=count then begin READ(Store:Rcd, Customer); XEOF := INDEX(Customer.NAME,'/EOF/') <> 0; EOFS := (Customer.NAME[1]=CTRLZ); WRITELN; IF NOT EOFS THEN WRITELN( Rcd:3, ': ', Customer.NAME); writeln(' ':5,'XEOF = ', XEOF, ' ':5,'EOFS = ', EOFS ); end Else Writeln('Read Beyond End Of File'); 99:{exit here when done} UNTIL DONE; CLEAR;{always be neat and clear the screen of your garbage} End{of Program RT}. .