Upload
jara
View
35
Download
0
Embed Size (px)
DESCRIPTION
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; - PowerPoint PPT Presentation
Citation preview
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