Linguagem de Programação Aula 10 Arquivos Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Técnico em Informática Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno
Persistência de dados em memória secundária
Arquivos Permitem o armazenamento de dados em memória secundária (discos rígidos, memória flash, discos óticos, discos flexíveis, etc.); Que utilidade teriam nossos programas se toda a informação computada por eles se perder quando os mesmos são encerrados? Arquivos possibilitam armazenar dados para posterior recuperação.
Tipos de Arquivos Podemos diferenciar basicamente 2 tipos de arquivos: Arquivos sequencial Também conhecido como arquivo texto; Seu conteúdo somente pode ser acessado de forma sequencial; Compõe-se basicamente de uma sequência de caracteres em formato livre (não definido), pode ser editado por qualquer editor de textos Arquivos randômico Também conhecido como arquivo binário; Seu conteúdo é organizado de forma que seja possível acessar uma determinada posição do arquivo de maneira aleatória (sem precisar passar por todo o arquivo); Compõe-se de dados de um mesmo tipo dispostos sequencialmente.
Arquivos sequenciais
Arquivos sequenciais Um arquivo sequencial é organizado como sequências de caracteres em formato livre; Um arquivo fonte de uma linguagem de programação, uma página HTML, um arquivo XML ou um arquivo TXT são exemplos de arquivos sequenciais. Não há como achar uma informação dentro do arquivo sem necessariamente percorrê-lo do início até o final
Arquivos sequenciais em Pascal - TEXT Em linguagem Pascal, o tipo TEXT é utilizado para definir que uma variável irá representar um arquivo sequencial. var ListaDeTarefas : TEXT; begin //associa a variável ao arquivo físico Assign(ListaDeTarefas, 'lista.txt'); Rewrite(ListaDeTarefas); //Cria o arquivo em disco //Escreve os dados no arquivo WriteLN(ListaDeTarefas, 'Estudar Programação'); WriteLN(ListaDeTarefas, 'Namorar'); WriteLN(ListaDeTarefas, 'Fazer exercícios'); Novos comandos para tratamento de arquivos Close(ListaDeTarefas); //Fecha e grava o arquivo em disco end.
Testando a existência de um arquivo A ideia de arquivos é fazer a persistência de dados para uso futuro, sendo assim, devemos prever a existência de um arquivo antes de propor sua criação e só o criá-lo caso não exista. O código abaixo demonstra como fazer isso com uma diretiva de compilação que desabilita a verificação de erros de E/S Assign(ListaDeTarefas, 'lista.txt'); {$i-} //Desabilita a checagem de erros de E/S (Entrada e Saída) Reset(ListaDeTarefas); //Tenta abrir o arquivo {$i+} //Habilita a checagem de erros de E/S if IOResult > 0 then //Se houve algum erro de ES Rewrite(ListaDeTarefas); //Recria o arq. pois ele ñ existe
Percorrendo um arquivo sequencial Para obtermos os dados de um arquivo sequencial precisamos percorrê-lo do início ao fim, o código abaixo demonstra como isso pode ser feito (o código lista os dados de um arquivo na tela). writeln('digite o nome do arquivo para ser listado: '); readln(nome_arquivo); Assign(ListaDeTarefas, nome_arquivo); //Associa variável e arq. Reset(ListaDeTarefas); //Abrir o arquivo while not eof(listadetarefas) do //Enquanto não chegar ao final begin //Lê do arquivo e armazena na variável linha readln(listadetarefas, linha); writeln(linha); //Escreve a variável linha na tela end;
Arquivos randômicos Registro 1 Registro 2 Registro 3... Registro N Campo 1 Campo 2 Campo 3
Arquivos randômicos Um arquivo randômico é organizado com sequências de elementos de um mesmo tipo, geralmente registros. É o tipo de arquivo mais comum em aplicações. O arquivo randômico possibilita navegação entre seus registros de forma aleatória. É possível visitar o primeiro, o último ou o enésimo registro do arquivo diretamente.
Arquivos binários em Pascal FILE of Em linguagem Pascal, o tipo FILE of é utilizado para definir que uma variável irá representar um arquivo binário. type TAlunos = record nome : string; sexo : char; ano_nasc : integer; end; var ArquivoDeInteiros : FILE of Integer; begin CadastroDeAluno : FILE of TAlunos; Campos do registro Registros do Arquivo nome sexo ano_nasc Ana F 1994 Pedro M 1993 Julia F 1984 Saulo M 1988 end.
Gravando dados em arquivos binários Para gravar informações em um arquivo binário é necessário uma variável do mesmo tipo na qual o arquivo é organizado. Os dados são gravados na posição atual do arquivo. var arqalunos : File of TAlunos; alunos : TAlunos; begin Assign(arqAlunos, 'dados.dat'); Rewrite(arqAlunos); alunos.nome := 'Ana'; alunos.sexo := 'F'; alunos.ano_nasc := 1985; write(arqalunos, alunos); close(arqalunos); end;
Recuperando dados de arq. binários Para recuperar informações de um arquivo binário é necessário uma variável do mesmo tipo na qual o arquivo é organizado. var arqalunos : File of TAlunos; alunos : TAlunos; begin Assign(arqAlunos, 'dados.dat'); Reset(arqAlunos); while not eof(arqalunos) do begin read(arqalunos, alunos); writeln(alunos.nome, ', sexo = ', alunos.sexo); end; close(arqalunos); end;
Ponteiro lógico de um arquivo binário O ponteiro lógico indica a posição atual em que o arquivo se encontra (o número do registro). Arquivos binários permitem a movimentação do ponteiro lógico em qualquer direção; O comando seek é utilizado para movimentar o ponteiro um determinado número de posições; O comando FileSize retorna quantas posições possui um arquivo e o comando FilePos retorna a posição atual do ponteiro lógico; Comandos como writeln e readln movimentam automaticamente o ponteiro lógico para a próxima posição.
Acessando posições aleatórias em arquivos binários writeln('o arquivo tem ', FileSize(arqAlunos), ' registros'); writeln('informe o nº do registro para consultar ')'); readln(posicao - 1); //A posição inicial é sempre zero seek(arqalunos, posicao); read(arqalunos, a); writeln('nome: ', a.nome, ', sexo: ', a.sexo); //Para mover o ponteiro lógico do arquivo para o primeiro registro seek(arqalunos, 0); //Para mover o ponteiro lógico para o final do arquivo seek(arqalunos, FileSize(arqAlunos));
Exercícios para fixação http://www.cafw.ufsm.br/~bruno/disciplinas/ling_programacao/exercicios/lista10.html