Índice de Aulas  Próxima Aula  Aula Anterior  Página Principal

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.



Índice de Aulas    Próxima Aula  Aula Anterior  Página Principal