
Captulo 27 - manipulao de arquivos sem tipo

  s vezes, temos a necessidade de manipular arquivos sem saber qual seu 
tipo de contedo. Poderamos defin-lo do tipo BYTE, ou ainda, do tipo CHAR,
porm se o arquivo tiver um tamanho relativamente grande, sua manipulao
ser meio lenta e neste caso, temos algumas opes. Vejamos ento a seguir:

BLOCKREAD - procedimento que permite a leitura de um ou mais registros 
(blocos de 128 Bytes), num mximo de 65535 Bytes (64 K) de um arquivo sem
tipo em uma varivel que pode ser de qualquer tipo. sua sintaxe:
BLOCKREAD (VAR<arq> : FILE; VAR < buffer>; <contador> : WORD;[VAR
<resultado> : WORD]);

BLOCKWRITE - procedimento que permite a gravao de um ou mais registros 
(bloco de 128 Bytes) de um arquivo sem tipo em uma varivel que pode ser 
de qualquer tipo. Sua sintaxe:
BLOCKWRITE (VAR <arq> : FILE; VAR <buffer>; <contador> : WORD; [VAR
<RESULTADO> : WORD]);
Vejamos agora, um exemplo que utilize esses dois comandos:
PROGRAM teste_block;
VAR
  arqent, arqsai : FILE;
  nomeent, nomesai : STRING[79];
  lidos, gravados : WORD;
  buf : ARRAY[1..4096] OF CHAR;
BEGIN
  WRITE (entre com o nome do arquivo de origem);
  READLN (nomeent);
  ASSIGN (arqent,nomeent);
  RESET (arqent,1);
  WRITE (entre com o nome do arquivo de destin);
  READLN (nomesai);
  ASSIGN (arqsai,nomesai);
  REWRITE (arqsai,1);
  WRITELN (copiand,FILESIZE(arqent),Bytes...);
  REPEAT
    BLOCKREAD (arqent, buf, SIZEOF(buf), lidos);
    BLOCKWRITE (arqsai, buf lidos, gravados);
  UNTIL (lidos = 0) OR (gravados <> lidos);
  CLOSE (arqent);
  CLOSE (arqsai);
END.
   de fundamental importncia, que ao abrir o arquivo coloque-se alm da
varivel tipo FILE, tambm o tamanho 1. 

TRUNCATE - este procedimento faz com que o arquivo seja truncado em seu ta-
manho, na posio corrente do ponteiro do arquivo. Sua sintaxe:
TRUNCATE (VAR <arq>);
Vejamos um exemplo:
PROGRAM teste_truncate;
VAR
  arq : FILE OF INTEGER;
  i, j : INTEGER;
BEGIN
  ASSIGN (arq, TEST.INT);
  REWRITE (arq);
  FOR i := 1 TO 6 DO
    WRITE (arq, i);
  WRITELN (arquivo antes de truncar : );
  RESET (arq);
  WHILE NOT EOF (arq) DO
    BEGIN
      READ (arq, i);
      WRITELN (i);
    END;
  RESET (arq);
  FOR i := 1 TO 3 DO
    READ (arq, j);
  TRUNCATE (arq);
  WRITELN;
  WRITELN (arquivo aps truncar:);
  RESET (arq);
  WHILE NOT EOF (arq) DO
    BEGIN
      READ (arq, i);
      WRITELN (i);
    END;
  CLOSE (arq);
  ERASE (arq);
  READLN;
END.
