Algoritmos e
Estruturas de Dados II
ARQUIVOS
Rodney Carneiro
Arquivos

Permitem o armazenamento permanente dos
dados, ao contrário das variáveis, que eram
armazenadas em memória principal;
– Exemplos: informações bancárias, dados de uma
companhia telefônica, um simples cadastro de
clientes;

Um arquivo é uma estrutura criada em disco,
ou em uma unidade de armazenamento
permanente;
Arquivos

Um arquivo é uma estrutura de dados
formada por um conjunto de registros, que
por sua vez, são possuem campos de
informação;
 Um registro não ocupa uma posição fixa
dentro de um arquivo, pois este não possui
tamanho pré-estabelecido (tamanho variável)
Arquivo
Registros
Disco
Campos
...
Campos
Registros
Campos
...
Campos
Registros
...
Campos
...
Campos
Arquivos

Então podemos enxergar um arquivo como
uma coleção de registros, que por sua vez
armazenam um conjunto de campos
relacionados à um mesmo item de dado;
 Um mesmo arquivo pode ser manipulado por
algoritmos diferentes. Desta forma, um
arquivo pode ser aberto por diferentes
programas, desde que os mesmos estejam
preparados para isto;
Estrutura Física de um Arquivo
Quando um arquivo FILE é criado, o mesmo possui a
seguinte estrutura:
 A posição física corresponde a um número que é
gerado automaticamente no instante que uma
informação qualquer é incluída no arquivo.
 Este número corresponde ao “Endereço” da
informação no arquivo, sendo que é através deste
Endereço que é possível recuperar qualquer
informação, sem precisar percorrer todo o arquivo
em busca da mesma, ao invés disto basta fornecer o
número da posição física da informação no arquivo.
Arquivos

A primeira coisa que deve ser feita para se
criar um arquivo, é declará-lo. E para isto, é
preciso definir de que tipo são os registros
que ele armazenará;
 Exemplo:
– Criação de um arquivo
para armazenar informações
de clientes (nome, telefone,
endereço e cidade);
Type
cliente = record
codigo
: integer;
nome
: string[20];
telefone : string[14];
endereco : string[30];
cidade
: string[20];
end;
Var
aux: cliente;
arq_nome: file of cliente;
Arquivos

Depois da criação de um arquivo, ele pode
ser utilizado de duas formas:
– O arquivo pode ser consultado, fornecendo
informações previamente gravadas nele (leitura);
– O arquivo pode ser acrescido de novas
informações (escrita ou gravação);

Os algoritmos básicos envolvidos nestas
duas circunstâncias são:
Consultar arquivo
Abrir arquivo
Achar item procurado
Copiar informações
Fechar arquivo
1
2
3
4
Acrescentar arquivo
Abrir arquivo
Achar posição da inserção
Gravar informações
Fechar arquivo
Arquivos

Antes de realizar qualquer operação sobre
um arquivo, é necessário criar um
identificador para o mesmo;
 Isto feito, as ações passarão a ser
direcionadas ao arquivo a partir deste
identificador;
 Na linguagem Pascal, o comando que
associa um identificador à um arquivo físico é
o assign, e ele pode ser usado da seguinte
forma:
assign(arq_nome,‘C:\dados.dat');
Onde arq_nome é o identificador, e o segundo parâmetro é o nome
físico do arquivo que será manipulado.
Rotina
: ASSIGN( )
Função : Serve para associar um determinado Nome de arquivo, no
disco ou disquete com o arquivo definido pelo programador.
Sintaxe
: ASSIGN(Meu_Arquivo, STRING_Com_Nome_Arquivo_DOS).
Exemplo:
PROGRAM TESTE;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
BEGIN
ASSIGN (Arq_nome, ’c:\dados.dat’);
END.
Onde:
Arq_nome
Nome Lógico do arquivo (aquele que será referenciado pelo programador na
construção do seu código fonte
C:\
Diretório, ou caminho onde será armazenado o arquivo no disco
dados.dat
Nome físico do arquivo que será manipulado
Arquivos

Abrindo um arquivo: é sempre necessário
abrir um arquivo para que se possa adicionar
ou ler informações no/do mesmo;
 Existem três formas de se abrir um arquivo:
– rewrite;
– reset;
– append; (somente p/ texto)

Sintaxe:
– Abrir um arquivo
novo (inicializar);
Procedure Abrir;
Begin
assign(arq_nome,‘c:\dados.dat');
rewrite (arq_nome);
End;
– Na linguagem Pascal, o comando rewrite é utilizado para
abrir um arquivo inicializando-o. Com o uso deste comando,
se o arquivo não existir, o Turbo Pascal irá criá-lo. Se existir,
seu conteúdo será destruído.
Rotina
: REWRITE( )
Função : Cria e abre para E\S um arquivo. Caso o arquivo não exista, o
mesmo será criado. Caso o arquivo já exista, todos os dados existentes
nele serão apagados.
Sintaxe : REWRITE(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
BEGIN
ASSIGN (Arq_nome, ’c:\dados.dat’);
REWRITE (Arq_nome);
END.
Arquivos

Abrir um arquivo já existente, sem
destruir seu conteúdo;
– Na linguagem Pascal, o comando reset é utilizado
para abrir um arquivo preservando seu conteúdo
pré-existente. Este comando é utilizado,
principalmente, para abrir um arquivo para a
leitura, pois ele posiciona o ponteiro do arquivo no
primeiro registro gravado no mesmo.
• Uma tentativa de abrir um arquivo não
existente com reset pode provocar um erro de
E/S. Para solucionar isto, deve-se desativar a
diretiva I do compilador com o comando {$I-}.
Procedure Abrir;
Begin
assign(arq_nome,‘c:\dados.dat');
reset (arq_nome);
End;
Rotina
: RESET( )
Função : Abre para E/S um arquivo que já exista. Caso o arquivo não
exista ocorrerá um erro de execução e o programa será abortado.
Sintaxe : RESET(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
BEGIN
ASSIGN (Arq_nome, ’c:\dados.dat’);
RESET (Arq_nome);
END.
Arquivos

Abrir um arquivo texto já existente, sem
destruir seu conteúdo, preparando-o
para gravar informações;
– Na linguagem Pascal, o comando append é
utilizado para abrir um arquivo preservando seu
conteúdo pré-existente. Este comando é utilizado,
principalmente, para abrir um arquivo para a
gravação de dados, pois ele posiciona o ponteiro
no final do arquivo.
Procedure Abrir;
Begin
assign(arq_nome,‘c:\dados.dat');
append (arq_nome);
End;
Arquivos

Fechando um arquivo: é sempre necessário
fechar um arquivo após o seu uso, para não
deixar o seu conteúdo exposto e nem
comprometer a sua integridade;
 Depois de fechado um arquivo, para utilizá-lo
novamente basta abrí-lo (com rewrite, reset,
ou append). Não é necessário associá-lo
novamente a um arquivo físico com o
comando assign;
 Sintaxe:
Procedure Fechar;
– Fechar um
arquivo;
Begin
close (arq_nome);
End;
Rotina
: CLOSE( )
Função : Fecha um arquivo que tenha sido aberto com RESET\REWRITE.
Sintaxe : CLSE(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
BEGIN
ASSIGN (Arq_nome, ’c:\dados.dat’);
RESET (Arq_nome);
CLOSE(Arq_nome)
END.
Rotina
: WRITE( )
Função : A Rotina WRITE tem a mesma Função de saída de informações como até
agora já tínhamos trabalhado, somente que ao invés da informação ser apresentada no
vídeo, a mesma será armazenada em um arquivo.
Sintaxe
: WRITE (Meu_Arquivo, Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_Nome : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arq_nome ‘C:\Dados.Dat’);
REWRITE (Arq_nome);
CLRSCR;
WRITE (‘Digite o Codigo: ‘);
READLN (Reg.Codigo);
WRITE (‘Digite o Nome: ‘);
READLN (Reg.Nome);
WRITE (‘Digite o Salario: ‘);
READ LN(Reg.Salario);
WRITE (Arq_nome, Reg);
CLOSE (Arq_nome);
END.
Rotina
: READ( )
Função
: A Rotina READ tem a mesma Função de entrada de informações como até agora já
tínhamos trabalhado, somente que ao invés da leitura ser feita pelo teclado, a mesma será feita de um
arquivo.
Sintaxe
: READ (Meu_Arquivo, Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arq_nome, ‘C:\Dados.Dat’);
RESET (Arq_nome);
READ (Arq_nome, Reg);
CLRSCR;
WRITELN (‘Codigo = ‘, Reg.Codigo);
WRITE LN(‘Nome = ‘, Reg.Nome);
WRITELN(‘Salario = ‘,Reg.Salario:0:2);
CLOSE (Arq_nome);
END.
Observação: Após cada operação READ/WRITE no arquivo, o endereço do registro corrente no arquivo
é incrementado em uma unidade. Assim por Exemplo, se o endereço do registro corrente é igual a 10,
após uma operação de READ/WRITE, o registro corrente passará a ser o número 11.
Rotina
: FILEPOS( )
Função : Retorna um número inteiro indicando qual o registro corrente em um
arquivo.
Sintaxe : Registro_Corrente : = FILEPOS (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
Corrente : INTEGER;
BEGIN
ASSIGN (Arq_nome, ‘C:\Dados.Dat’);
RESET (Arq_nome);
Corrente : = FILEPOS(Arq_nome);
CLRSCR;
WRITELN(Corrente);
CLOSE (Arq_nome);
END.
Rotina
: FILESIZE( )
Função : Retorna quantos registro existem armazenados no arquivo.
Sintaxe : Tamanho_Arquivo : = FILESIZE (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
Total_reg : INTEGER;
BEGIN
ASSIGN (Arq_nome, ‘C:\Dados.Dat’);
RESET (Arq_nome);
Total_reg : = FILESIZE (Arq_nome);
CLRSCR;
WRITELN (Total_reg);
CLOSE (Arq_nome);
END.
Arquivos

Outros comandos para a manipulação
de arquivo:
– Seek(F,P);
• Move o ponteiro do arquivo F para o início do
número de registro P;
– EOF(F);
• Retorna verdadeiro se o ponteiro do arquivo F
estiver posicionado no final (último registro);
Rotina
: SEEK( )
Função : Posiciona o ponteiro do arquivo em um registro determinado, para que o
mesmo possa ser processado.
Sintaxe
: SEEK(Meu_Arquivo, Endereço_Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arq_nome, ‘c:\Dados.Dat’);
RESET (Arq_nome);
SEEK (Arq_nome, 10);
READ (Arq_nome Reg);
CLRSCR;
WRITELN(‘Codigo = ‘, Reg.Codigo);
WRITELN (‘Nome = ‘, Reg.Nome);
WRITELN (‘Salario = ‘, Reg.Salario:0:2);
CLOSE (Arq_nome);
END.
Observação: O Comando SEEK, posicionará o cursor (Indicador de Registro) no registro fisico número
10;
Rotina
: EOF( )
Função
: Esta é uma função Booleana, que Retorna TRUE caso se alcance o final do arquivo,
FALSE caso contrário.
Sintaxe
: Chegou_Final : = EOF (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
USES CRT;
TYPE
Registro = RECORD
Codigo : INTEGER;
Nome : STRING;
Salario : REAL;
END;
VAR
Arq_nome : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arq_nome, ‘C:\Dados.Dat’);
RESET (Arq_nome);
WHILE NOT EOF(Arq_nome) DO
BEGIN
READ (Arq_nome, Reg);
CLRSCR;
WRITELN(‘Codigo = ‘,Reg.Codigo);
WRITELN(‘Nome = ‘, Reg.Nome);
WRITE LN(‘Salario = ‘, Reg.Salario:0:2);
READKEY;
END;
CLOSE (Arq_nome);
END.
Observação: Neste exemplo será realizado a leitura do primeiro registro do arquivo até o final do arquivo, apresentando
cada registro na tela;
A instrução WHILE NOT EOF(Arq_nome) DO quer dizer, Faça enquanto NAO FOR O FINAL DO ARQUIVO.
Diretivas de Erros Pascal

O Turbo Pascal possui diretivas de compilação para
ativação/desativação da verificação automática de
erros, permitindo que o código do erro possa ser
identificado com a função IOResult.
{$I-}
{$I+}


Desativa a verificação automática de erros
Ativa a verificação automática de erros
Quando for utilizada a diretiva {$I-}, o programa não
será abortado quando uma operação de
Entrada/Saída não for bem sucedida.
Se a operação for bem sucedida a função IOResult
retorna 0, do contrário retorna o código do erro (Ver
exemplo a seguir).
Controlar a Abertura de um Arquivo

Rotina para abertura de arquivo:
Procedure abre_arq (nome: string);
Begin
Assign (arq_nome, ‘c:\dados.dat’);
{$I-}
Reset (arq_nome);
{$I+}
If Ioresult <>0 then
begin
Rewrite (arq_nome);
end;
End;
OBSERVAÇAO: A variável IORESULT é uma variável de ambiente, ela armazena o código do erro, após
uma operação em um Arquivo Pascal;
Se IORESULT for igual a Zero quer dizer que nao deu erro, qualquer valor Diferente de Zero,
representa um erro que deve ser consultada na tabela de erros do PASCAL
Algoritmos e
Estruturas de Dados II
ARQUIVOS
Rodney Carneiro
Download

Arquivos - rodneycarneiro.com.br