{ JOAO PAULO SCHWARZ SCHULER }
unit U_GEN;
INTERFACE
uses crt,dos;
function IFW(EXP : boolean;O1,O2 : word):word;
{se a expressao EXP for verdadeira, devolve Operando 1; senao, Operando 2}
{-------------------- IO de disco ---------------------------------------}
type IODiskBuffer = record
Buf : array[0..2047] of byte;{buffer propriamente dito}
NUM : word; {numero de bytes no buffer }
Modified : boolean;{ se o buffer foi modificado}
TAB : longint; { numero da tabela (pagina) }
end;
type IODISK = object
F:file ;
NOME:string; { nome do arquivo }
BUFIN:IODiskBuffer; { buffer de leitura }
BUFOUT:IODiskBuffer; { buffer de escrita }
constructor Init(PNOME:string);
{ abre o arquivo }
{ open a file }
function Read(POS:longint):byte;
{ le um byte da posicao POS }
{ read a byte on position POS }
procedure Write(POS:longint;INF:byte);
{ escreve um byte INF na posicao POS }
{ write a byte on position POS }
function TAMANHO:longint;
{ devolve o tamanho do arquivo }
{ returns the byte's number of a file }
procedure HARD;
{ gravacao fisica do buffer de saida }
{ record buffers}
procedure RELOAD;
{ le os buffers novamente do disco }
{ reload buffers }
destructor Done;
{ fecha arquivo }
{ close file }
end;
IMPLEMENTATION
{ -------- Objeto de Entrada e saida de disco ------------------- }
function FileExists(FileName: String): Boolean; { RETIREDO DO TURBO HELP }
{ Boolean function that returns True if the file exists;otherwise,
it returns False. Closes the file if it exists. }
var
F: file;
begin
{$I-}
Assign(F, FileName);
Reset(F);
Close(F);
{$I+}
FileExists := (IOResult = 0) and (FileName <> '');
end; { FileExists }
constructor IODISK.Init(PNOME:string);
{ abre o arquivo }
begin
NOME:=PNOME;
assign(F,NOME);
if FileExists(NOME)
then reset(F,1)
else rewrite(F,1);
seek(F,0);
{ prepara buffer de entrada }
BUFIN.TAB:=0;
BUFIN.MODIFIED:=false;
blockread(F,BUFIN.BUF,2048,BUFIN.NUM);
{prepara arquivo de saida }
seek(F,0);
BUFOUT.TAB:=0;
BUFOUT.MODIFIED:=false;
blockread(F,BUFOUT.BUF,2048,BUFOUT.NUM);
end;
function IODISK.Read(POS:longint):byte;
{ le um byte da posicao POS }
var TAB:longint; { tabela para alocar }
POSONTAB:word; { posicao na tabela }
RESULT:byte;
begin
TAB:=POS shr 11;
POSONTAB:= POS and 2047;
if BUFOUT.TAB=TAB then { procura na tabela de escrita }
begin
RESULT:=BUFOUT.BUF[POSONTAB];
end
else
begin
if BUFIN.TAB=TAB then { procaura na tabela de leitura }
begin
RESULT:=BUFIN.BUF[POSONTAB];
end
else
begin { le outra tabela }
seek(F,TAB shl 11);
BUFIN.TAB:=TAB;
BUFIN.MODIFIED:=false;
blockread(F,BUFIN.BUF,2048,BUFIN.NUM);
RESULT:=BUFIN.BUF[POSONTAB];
end;
end;
READ:=result;
end; { of function }
procedure IODISK.Write(POS:longint;INF:byte);
{ escreve um byte INF na posicao POS }
var TAB:longint; { tabela para alocar }
POSONTAB:word; { posicao na tabela }
begin
TAB:=POS shr 11;
POSONTAB:= POS and 2047;
if BUFIN.TAB=TAB then
begin
BUFIN.BUF[POSONTAB]:=INF; { grava informacao no buffer de leitura }
end;
if BUFOUT.TAB=TAB then
begin
BUFOUT.BUF[POSONTAB]:=INF;
BUFOUT.MODIFIED:=true;
end
else
begin
if BUFOUT.MODIFIED then
begin
seek(F,BUFOUT.TAB shl 11); { grava buffer antigo }
blockwrite(F,BUFOUT.BUF,BUFOUT.NUM);
BUFOUT.MODIFIED:=false;
end;
seek(F,TAB shl 11);
BUFOUT.TAB:=TAB;
blockread(F,BUFOUT.BUF,2048,BUFOUT.NUM);
BUFOUT.BUF[POSONTAB]:=INF;
BUFOUT.MODIFIED:=true;
end;
if BUFOUT.NUM<succ(POSONTAB)
then BUFOUT.NUM:=succ(POSONTAB); {GARANTE GRAVACAO DENTRO DO BUFFER}
end; { of procedure }
function IODISK.TAMANHO:longint;
{ devolve o tamanho do arquivo }
begin
TAMANHO:=filesize(F);
end;
procedure IODISK.HARD;
{ gravacao fisica do buffer de saida }
begin
if BUFOUT.MODIFIED then
begin
seek(F,BUFOUT.TAB shl 11); { grava buffer antigo }
blockwrite(F,BUFOUT.BUF,BUFOUT.NUM);
BUFOUT.MODIFIED:=false;
end;
end;
procedure IODISK.RELOAD;
{ le os buffers novamente do disco }
begin
{ prepara buffer de entrada }
BUFIN.MODIFIED:=false;
seek(F,BUFIN.TAB shl 11);
blockread(F,BUFIN.BUF,2048,BUFIN.NUM);
{prepara arquivo de saida }
seek(F,BUFOUT.TAB shl 11);
BUFOUT.MODIFIED:=false;
blockread(F,BUFOUT.BUF,2048,BUFOUT.NUM);
end;
destructor IODISK.Done;
{ fecha arquivo }
begin
HARD;
close(F);
end;
function IFW(EXP : boolean;O1,O2 : word):word;
{se a expressao EXP for verdadeira devolve Operando 1 senao Operando 2}
begin
if EXP then IFW := O1
else IFW := O2;
end;
end.
uses U_GEN;
var I,O:IODISK;
l:LONGINT;
BEGIN
I.INIT('NADA.TXT');
O.INIT('POPO.TXT');
FOR L:=1 TO I.TAMANHO DO
O.WRITE(PRED(L),I.READ(PRED(L)));
I.DONE;
O.DONE;
END.
Return to the Home Page
I want to read your E-Mail