Aula 18: Operações com Arquivos

As operações básicas realizadas sobre um arquivo são abertura, leitura, escrita e fechamento.

A abertura de arquivos corresponde à ação de se associar o arquivo declarado no programa com o arquivo físico. O primeiro registro do arquivo fica disponível para leitura através do seguinte comando:

reset(nome-do-arquivo);

Caso o arquivo já exista, para começar a escrever novamente no arquivo, ignorando-se os registros anteriores, utiliza-se o seguinte comando:

rewrite(nome-do-arquivo);

O nomo-do-arquivo é o identificador do arquivo no programa. Para se fazer uma associação desta identificação interna com a identificação externa, usa-se o comando assign, cuja forma é:

assign(nome-do-arquivo,'nome-externo');

nome-externo é o nome pelo qual o arquivo é conhecido externamente ao programa.

O comando assign deve anteceder a abertura do arquivo e nunca deve ser utilizado quando o arquivo já estiver sendo manipulado.

O fechamento do arquivo desvincula o arquivo do programa, atualizando as informações do arquivo no ambiente do sistema operacional. Para se fechar um arquivo, usa-se o comando:

close(nome-do-arquivo);

Para ler um arquivo, ou seja ler o seu conteúdo, é utilizado o seguinte comando:

read(nome-do-arquivo,registro);

Esse comando lê o conteúdo do registro corrente do arquivo associado à nome-do-arquivo e armazena-o em na variável registro, que deve ser do mesmo tipo do arquivo. Após a execução desse comando, o registro corrente é lido, e o próximo passa a ser o registro corrente.

Para escrever em um arquivo, é utilizado o seguinte comando:

write(nome-do-arquivo,registro);

Esse comando, quando executado, grava no registro corrente do arquivo associado à nome-do-arquivo o conteúdo da variável registro.

Usando somente os comandos read e write, os registros estão acessíveis somente sequencialmente, ou seja, um registro será acessado somente após todos os seus anterioes sejam acessados.

É possível acessar um registro qualquer do arquivo diretamente, desde que se saiba a sua posição física no arquivo. Esse tipo de acesso é conseguido pelo comando:

seek(nome-do-arquivo,n);

Com esse comando é possível acessar o n-ésimo registro do arquivo associado à nome-do-arquivo, caso n seja menor que o número de registros do arquivo. O primeiro registro é o de número 0 (zero).

Para se obter o número de registros de um arquivo, utiliza-se o comando:

filesize(nome-do-arquivo);

Com a utilização dos comandos seek e filesize temos um outro tipo de organização ou acesso aos arquivos: a organização direta. Neste caso temos que escolher uma chave para indexar os registros, ou seja, essa chave será utilizada para indicar em que posição no arquivo um registro será armazenado.

Exemplo 4.7:

program sequencial;

type
endereco = record

        rua : string[40];
        numero : integer;
        CEP : real;
      end;

cadastro = record

        nome : string[30];
        ender : endereco;
        CPF: real;
        Sexo : char;
        nascimento : real;
        rg : real;
      end;

arqcad = file of cadastro;

var

    arq_in, arq_out : arqcad;
    reg: cadastro;

begin

    assign(arq_out,'sample.dat'); {associando nome interno com nome externo}
    rewrite(arq_out); {abrindo arquivo para gravação}
    write('Nome: ');
    readln(reg.nome);
    while (reg.nome <> 'fim') do
      begin
        write('Rua: ');
        readln(reg.ender.rua);
        write('Numero: ');
        readln(reg.ender.numero);
        write('CEP: ');
        readln(reg.ender.CEP);
        write('CPF: ');
        readln(reg.CPF);
        write('Sexo(M/F): ');
        readln(reg.Sexo);
        write('Data de Nascimento(dd/mm/aaaa): ');
        readln(reg.nascimento);
        write('RG: ');
        readln(reg.rg);
        write(arq_out,reg); {grava registro após o último registro do arquivo}
        readln(reg.nome);
      end;
    close(arq_out);
    assign(arq_in,'sample.dat'); {associando nome interno com nome externo}
    reset(arq_in); {abrindo arquivo para leitura}
    read(arq_in,reg);
    while (not EOF(arq_in)) do
      begin
        write(reg.ender,rua,' ');
        write(reg.ender.numero,' ');
        write(reg.ender.CEP,' ');
        write(reg.CPF,' ');
        write(reg.Sexo,' ');
        write(reg.nascimento,' ');
        writeln(reg.rg,' ');
      end;
    writeln('O número de registros do arquivo é: ',filesize(arq_in));
end.

Este programa a seguir exemplifica a utilização dos comando seek. Neste caso assumimos que as chaves estão no intervalo entre 1 e 100.

program acesso_direto;

type
endereco = record

        rua : string[40];
        numero : integer;
        CEP : real;
      end;
cadastro = record
        chave : integer;
        nome : string[30];
        ender : endereco;
        CPF: real;
        Sexo : char;
        nascimento : real;
        rg : real;
      end;

arqcad = file of cadastro;
tammax = 100;

var

    arq_out : arqcad;
    reg : cadastro;

begin

    assign(arq_out,'sample.dat'); {associando nome interno com nome externo}
    rewrite(arq_out); {abrindo arquivo para gravação}
    write('Chave: ');
    readln(reg.chave);
    while (reg.chave <> 0) do
      begin
        if (reg.chave >= 1) and (reg.chave <= 100) then
          begin
            write('Nome: ');
            readln(reg.nome);
            write('Rua: ');
            readln(reg.ender.rua);
            write('Numero: ');
            readln(reg.ender.numero);
            write('CEP: ');
            readln(reg.ender.CEP);
            write('CPF: ');
            readln(reg.CPF);
            write('Sexo(M/F): ');
            readln(reg.Sexo);
            write('Data de Nascimento(dd/mm/aaaa): ');
            readln(reg.nascimento);
            write('RG: ');
            readln(reg.rg);
            seek(arq_out,chave-1);
            write(arq_out,reg); { grava registro após o último registro do arquivo}
          end
        else
          begin
            writeln('Chave deve estar no intervalo [1,100].');
          end;
          write('Chave: ');
          readln(reg.chave);
        end;
      close(arq_out);
    end.


Aula Anterior | Índice | Próxima Aula