IODISK

{ 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.

 

Exemplo de Uso

Copia o arquivo NADA.TXT para o arquivo POPO.TXT

NADA.TXT is copied to POPO.TXT

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

Return to the Fontes em Pascal Page

I want to read your E-Mail