{ 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