Aula 9
Arquivos Binários
Quando não queremos perder os dados da memória principal, podemos armazená-los em memórias auxiliares por meio de arquivos. Os arquivos são conjunto de registros e como o próprio nome sugere guardam dados. No pascal existem 2 tipos de arquivos: binário e texto.
Declarando um arquivo
Para declarar um arquivo:
1- Usamos um identidicador ( Nome_Interno_do_arquivo
)
2- Indicamos que ele é arquivo através
da palavra reservada File
3- Indicamos qual tipo de dados que ele guarda
( of
tipo_de_dado )
Sintaxe:
Var
Nome_Interno_do_arquivo : File of Tipo_de_dado;
Exemplo:
Program Declarando_um_arquivo;
Var
Arquivo_de_numeros: File of Integer;
Begin
End.
Associando um arquivo ao nome externo
Todo arquivo tem um nome externo associado a ele, que é gravado em um memória auxiliar. Ex: dados.bin. Tudo que é feito dentro do programa com a variável Nome_Interno_do_arquivo é refletido em um arquivo externo. O comando que faz esta associação é o Assign
Sintaxe:
Assign ( Nome_Interno_do_arquivo, 'Path_do_nome_externo_do_arquivo' );
Exemplo:
Program Associando_um_arquivo;
Var
Arquivo_de_numeros: File of Integer;
Begin
Assign ( Arquivo_de_numeros, 'C:\ numero.bin');
End.
Criando um arquivo na memória auxiliar
Para criar um arquivo em uma memória auxiliar usamos o comando Rewrite . Este comando cria e abre o arquivo. Se o arquivo já existir, o seu conteúdo será apagado. Para usar este comando é necessário que o Nome_Interno_do_arquivo já tenha sido associado ao seu nome_externo usando o comando Assign
Sintaxe:
Rewrite ( Nome_Interno_do_arquivo );
Exemplo:
Program Criando_um_arquivo;
Var
Arquivo_de_numeros: File of Integer;
Begin
Assign (Arquivo_de_numeros,
'C:\ numero.bin' );
Rewrite (Arquivo_de_numeros
);
{ Se você der um dir na raiz verá que foi criado o arquivo numero.bin }
End.
Abrindo um arquivo
Para abrir um arquivo que já existe usamos o comando Reset . Se o arquivo não exitir ocorrerá um erro. Para usar este comando é necessário que o Nome_Interno_do_arquivo já tenha sido associado ao seu nome_externo usando o comando Assign
Sintaxe:
Reset ( Nome_Interno_do_arquivo );
Exemplo:
Program Abrindo_um_arquivo;
Var
Arquivo_de_numeros: File of Integer;
Begin
Assign ( Arquivo_de_numeros,
'C:\numero.bin' );
Reset ( Arquivo_de_numeros
);
{ Se o arquivo não existir ocorrerá um erro na execução }
End.
Fechando um um arquivo
Depois de abrir e manipular devemos fechar o arquivo com o comando Close
Sintaxe:
Close ( Nome_Interno_do_arquivo );
Exemplo:
Program Abrindo_e_Fechando_um_arquivo;
Var
Arquivo_de_numeros: File of Integer;
Begin
Assign ( Arquivo_de_numeros,
'C:\numero.bin' );
Reset ( Arquivo_de_numeros
);
Close ( Arquivo_de_numeros
);
End.
Gravando dados em um arquivo
Para gravar dados em um arquivo usamos o comando Write. Para utilizar este comando é necessário abir o arquivo que a depender do caso , se o arquivo já existe ou não , pode ser feito com os comando Rewrite ou Reset
Sintaxe:
Write( Nome_Interno_do_arquivo, Variável_Auxiliar1, Variável_Auxiliar2, ..., Variável_Auxiliarn );
Os dados que estam nas Variáveis_Auxiliares são gravados no arquivo de forma sequencial , isto é, eles formam tipo uma "fila" no arquivo. Estas variáveis devem ser do mesmo tipo do Nome_Interno_do_arquivo, isto é, se o arquivo é de numeros reais as variáveis_auxiliares devem ser reais também.
Exemplo:
Program Gravando_dados;
Var
Arquivo_de_numeros: File
of Integer;
Numero,Idade : integer;
Begin
Assign ( Arquivo_de_numeros,
'C:\numero.bin' );
Reset ( Arquivo_de_numeros
); { Suponho que o arquivo já exista . Caso
contrário use o comando Rewrite no lugar do Reset }
Write('Digite o seu numero da sorte - ');
Readln(numero);
Write('Digite a sua idade - ');
Readln(idade);
Write ( Arquivo_de_numeros,
numero,idade);
End.
Lendo dados em de arquivo
Para ler os dados de um arquivo usamos o comando Read. Para utlizar este comando é necessário abir o arquivo que a depender do caso , se ele já existe ou não, pode ser feito com os comando Rewrite ou Reset
Sintaxe:
Read ( Nome_Interno_do_arquivo, Variável_Auxiliar );
Obs: O dado que está no arquivo é
gravado na Variável_Auxiliar. Esta variável deve ser de tipo
compatível com o Nome_Interno_do_arquivo.
Exemplo:
Program Lendo_dados;
Var
Arquivo_de_numeros: File
of Integer;
numero,idade: integer;
Begin
Assign ( Arquivo_de_numeros,
'C:\numero.bin');
Reset ( Arquivo_de_numeros
);
{ Suponho que o arquivo já exista . Caso contrário use o comando Rewrite no lugar do Reset }
Write('Digite o seu numero da sorte - ');
Readln(numero);
Write('Digite a sua idade - ');
Readln(idade);
Write ( Arquivo_de_numeros,
numero,idade);
Close( Arquivo_de_numeros
);
{ Até este ponto o programa grava os dados no arquivo }
Reset ( Arquivo_de_numeros
);
Read ( Arquivo_de_numeros,
numero,idade);
Writeln( ' O primeiro dado do arquivo numero.bin
é o seu numero da sorte - ', numero);
Write( ' O segundo dado do arquivo numero.bin
é a sua idade - ', idade);
Close ( Arquivo_de_numeros
);
End.
Acesso Direto aos arquivos - ( Comando Seek )
Até agora para acessar um determinado registro de um arquivo é necessário passar um por um até atingir o desejado. Para acessar os dados de forma direta usa-se o comando Seek.
Quando gravamos dados ( registros ) em um arquivo eles são armazenados de forma sequêncial, formado um tipo de " fila ". Cada registro tem um número que indica sua ordem na "fila". Ao abrir um arquivo existe um apontador que incide sobre o primeiro registro de número 0 (zero) . Para ir direto a um registro usamos o seek que tem a seguinte
Sintaxe:
Seek ( Nome_Interno_do_arquivo,número_do_registro);
Obs: Como o primero registro tem número 0 para acessar o n-ésimo arquivo devemos usar a seguinte sintaxe: Seek ( Nome_Interno_do_arquivo, n-1 );
Complementos:
FileSize é uma função que retorna o número total de regitros deum arquivo binário.
Sintaxe:
FileSize ( Nome_Interno_do_Arquivo);
Para posicionar o apontador logo após o
último registro utilize o seguinte código
Seek ( Nome_Interno_do_Arquivo,
FileSize(Nome_Interno_do_Arquivo)
);
Eof ( End of File - Fim do Arquivo ) é uma função que retorna o verdadeiro ( True ) se tiver atingido o fim do arquivo ou se ele estiver vazio senão retorna falso ( False )
Sintaxe:
Eof ( Nome_Interno_do_Arquivo);
Exemplo:
Vamos construir um programa que grava o cadastro
de 5 clientes em um arquivo binário e depois imprime na tela os
dados do cliente solicitado.
Program Cadastro_de_Clientes;
Uses Crt;
Type
Cadastro = Record
Nome, Profissao:String;
Idade: Integer;
end;
Var
Arquivo_dos_Clientes: File of Cadastro;
Cliente: Array [1..5] of Cadastro;
Codigo_do_Cliente: Integer;
Begin
Assign(Arquivo_dos_Clientes,'C:\Dados.bin');
Rewrite(Arquivo_dos_Clientes);
For Codigo_do_Cliente:=1 to 5 do
Begin
Clrscr;
Writeln('Este é o Cliente de Código
- ',Codigo_do_Cliente);
Writeln;
Write(' Digite o Nome do cliente - ');
Readln( Cliente[Codigo_do_Cliente].nome );
Write(' Digite a profissão do cliente
- ');
Readln( Cliente[Codigo_do_Cliente].profissao
);
Write(' Digite a idade do cliente - ');
Readln( Cliente[Codigo_do_Cliente].idade);
Seek(Arquivo_dos_Clientes,FileSize(Arquivo_dos_Clientes));
Write(Arquivo_dos_Clientes,Cliente[Codigo_do_Cliente]);
Delay(1500);
End;
Clrscr;
Write('Digite o código do cliente que
deseja visulizar (1,2,3,4,5)');
Readln(Codigo_do_Cliente);
Seek(Arquivo_dos_Clientes,Codigo_do_Cliente-1);
Read(Arquivo_dos_Clientes,Cliente[Codigo_do_Cliente]);
Writeln;
Writeln('Este é o Código do Cliente
Solicitado - ',Codigo_do_Cliente);
Writeln;
Writeln(' Nome do cliente - ',Cliente[Codigo_do_Cliente].nome
);
Writeln(' Profissão do cliente - ',Cliente[Codigo_do_Cliente].profissao
);
Write(' Idade do cliente - ',Cliente[Codigo_do_Cliente].idade);
Repeat Until keypressed; { Espera o usuário teclar
algo }
Close(Arquivo_dos_Clientes);
End.