Algoritmos e Estruturas de Dados II ARQUIVOS Rodney Carneiro.

Post on 18-Apr-2015

105 views 2 download

Transcript of Algoritmos e Estruturas de Dados II ARQUIVOS Rodney Carneiro.

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

Campos

Campos... ...

Registros

Campos

Campos...

Registros

Campos

Campos...

Disco

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 ArquivoQuando 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;

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 Acrescentar arquivo

Abrir arquivo Abrir arquivo

Achar item procurado Achar posição da inserção

Copiar informações Gravar informações

Fechar arquivo Fechar arquivo

1

2

3

4

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 arquivonovo (inicializar);– 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.

Procedure Abrir;Begin assign(arq_nome,‘c:\dados.dat'); rewrite (arq_nome);End;

Procedure Abrir;Begin assign(arq_nome,‘c:\dados.dat'); rewrite (arq_nome);End;

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;

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;

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:– Fechar umarquivo; Procedure Fechar;

Begin close (arq_nome);End;

Procedure Fechar;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;

BEGINASSIGN (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;

BEGINASSIGN (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;

VARArq_nome : FILE OF Registro;Corrente : INTEGER;

BEGINASSIGN (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;

VARArq_nome : FILE OF Registro;Total_reg : INTEGER;

BEGINASSIGN (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;

VARArq_nome : FILE OF Registro;Reg : Registro;

BEGINASSIGN (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;

BEGINASSIGN (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-} Desativa a verificação automática de erros{$I+} 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