Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Professores: Dante Corbucci Filho Alexandre Plastino Conteúdo: - Tipos Estruturados (4a- Parte) - Arquivos Tipados (File) Aula 11 2 Arquivo Tipado (File of T_Elemento) Em Pascal, há basicamente dois tipos de arquivo: arquivo texto (text) e arquivo tipado (file of TElemento). Um arquivo texto é um conjunto de caracteres armazenados em disco sob um mesmo nome. Um arquivo tipado é uma seqüência de elementos de um mesmo tipo, armazenada em disco sob um mesmo nome. O conteúdo deste tipo de arquivo, ao contrário do tipo Text, não pode ser visualizado por editores de textos. 3 Arquivo Tipado (File of T_Elemento) O tipo File of T_Elemento define um arquivo que contém um conjunto de elementos do mesmo tipo T_Elemento que guardam entre si uma relação posicional, ou seja, a ordem dos elementos na seqüência é importante. Os elementos de um arquivo tipado são também chamados de registros do arquivo. A cada instante, apenas um elemento/registro do arquivo pode ser acessado. 4 Arquivo Tipado (File of T_Elemento) Os elementos de um arquivo tipado podem ser acessados seqüencialmente, um a um, na ordem em que estão armazenados, ou diretamente, informando-se a posição do elemento dentro do arquivo. O tamanho ou comprimento de um arquivo tipado é dado pelo número de elementos (registros) que o compõem. O arquivo vazio tem comprimento zero. 5 Variável do tipo File of T_Elemento Para utilizar (ler e/ou gravar) um arquivo tipado em Pascal, é necessário declarar uma variável que represente este arquivo. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Type T_Elemento = . . .; T_Arq = file of T_Elemento; Var Dados : T_Arq; Begin . . . End. Declaração da variável Dados que representa o arquivo cujos elementos são do tipo T_Elemento. 6 Exemplos A) Um arquivo com números inteiros: Type T_Arq_Inteiros = file of integer; Var Dados : T_Arq_Inteiros; B) Um arquivo contendo um cadastro de nomes: Type T_Arq_Nomes = file of string[20]; Var Cadastro : T_Arq_Nomes; 10 23456 568 0 11 98 <eof> [8 b Conteúdo deste arquivo tipado quando aberto pelo Kate João Luiz Sérgio Tchao Carlos Augusto Ana Julia Maria Augusta Antônio Jorge <eof> 7 Exemplos C) Um arquivo contendo um cadastro de funcionários: Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real; end; Arquivo = file of Registro; Var Cadastro : Arquivo; João Luiz 101 1234.56 Sérgio Tchao 102 1654.32 Carlos Augusto 103 789.00 Ana Julia 104 2345.67 Maria Augusta 105 899.91 Antônio Jorge 106 300.00 <eof> 8 Operações Básicas As operações básicas sobre arquivos são: - Declaração do tipo do arquivo e da variável que o representa, - Associação da variável que representa o arquivo a um arquivo em disco, - Abertura do arquivo, - Leitura ou gravação de registros no arquivo, - Fechamento do arquivo. 9 Declarações Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real; end; Arquivo = file of Registro; Var Cadastro : Arquivo; Begin . . . End. 10 Assign O comando Assign permite que um arquivo tipado em disco seja associado a uma variável. Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Var Cadastro : Arquivo; Begin assign (Cadastro , ’/mnt/floppy/dirdados/cad’); . . . End. Variável que representa o arquivo. Localização completa do arquivo. Nome interno do arquivo. Nome externo do arquivo. A partir deste ponto, a variável Cadastro se refere ao arquivo cad armazenado no disquete, no diretório dirdados. 11 Assign No comando Assign a identificação do arquivo (texto ou tipado) em disco pode ser feita por uma variável do tipo string. Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Var Cadastro : Arquivo; NomeArquivo: string; Begin write (output, ’Entre com o nome do arquivo de dados: ’); readln (input, NomeArquivo); assign (Cadastro , NomeArquivo); . . . End. 12 Abrindo um arquivo tipado De forma análoga a um arquivo texto, antes de ser utilizado (como entrada ou saída), um arquivo tipado também precisa ser aberto. No entanto, um arquivo tipado pode ser aberto tanto para leitura quanto para gravação. O comando Reset abre um arquivo tipado para leitura ou gravação, sem destruir seu conteúdo. O comando Rewrite abre um arquivo tipado para gravação, destruindo seu conteúdo prévio. Além disso, caso o arquivo não existisse, cria-o no diretório. 13 Reset O comando Reset permite que um arquivo tipado seja aberto para leitura e/ou escrita. Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Var Cadastro : Arquivo; Begin assign (Cadastro , ’/mnt/floppy/dirdados/cad’); reset (Cadastro); . . . End. Nome interno do arquivo. A partir deste ponto, o arquivo Cadastro pode ser lido. O primeiro registro a ser lido será o primeiro registro do arquivo (onde estará inicialmente a "cabeça de leitura"). 14 Rewrite O comando Rewrite permite que um arquivo tipado vazio seja aberto (preparado) para escrita. Se o arquivo não estiver vazio, seu conteúdo corrente será perdido. Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); . . . Var Resultado : Arquivo; Begin assign (Resultado, ’/mnt/floppy/resposta.txt’); rewrite (Resultado); . . . End. Nome interno do arquivo. A partir deste ponto, dados podem ser gravados no arquivo. O primeiro registro será gravado na primeira posição do arquivo. 15 Close O comando Close permite que um arquivo de entrada ou saída seja fechado. Sempre que não for mais utilizado, um arquivo deve ser fechado. Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); . . . Var Resultado : Arquivo; . . . Begin assign (Resultado, ’/mnt/floppy/resposta.txt’); rewrite (Resultado); . . . close (Resultado); End. Nome interno do arquivo. Este comando garante que todos os dados gravados no arquivo estarão efetivamente em disco. A partir deste ponto, o arquivo Resultado não poderá mais ser utilizado. 16 Read O comando read lê um registro do arquivo tipado e o armazena em uma variável do programa. Esta variável deve ser declarada com o mesmo tipo do arquivo. Ao ser aberto para leitura (comando reset), a cabeça de leitura (CL) é posicionada no primeiro registro do arquivo. O comando read lê o registro apontado pela cabeça de leitura e avança este ponteiro para o próximo registro. 17 Read (declaração de variável) Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = recordNome : string [20]; Codigo : Dominio; Salario : real; end; Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin . . . End. A variável Funcionario e os elementos do arquivo Cadastro são do tipo Registro. 18 Read Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign(Cadastro, ’/mnt/floppy/cadastro.txt’); reset(Cadastro); read(Cadastro, Funcionario); . . . End. Nome interno do arquivo. Variável que receberá conteúdo do registro lido. João Luiz 101 1234.56 Sérgio Tchao 102 1654.32 Carlos Augusto 103 789.00 Ana Julia 104 2345.67 Maria Augusta 105 899.91 Antônio Jorge 106 300.00 <eof> 19 Read Este comando abre o arquivo Cadastro para leitura e posiciona a cabeça de leitura no primeiro registro do arquivo. Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign (Cadastro, ’/mnt/floppy/cadastro.txt’); reset (Cadastro); read (Cadastro, Funcionario); . . . End. João Luiz 101 1234.56 Sérgio Tchao 102 1654.32 Carlos Augusto 103 789.00 Ana Julia 104 2345.67 Maria Augusta 105 899.91 Antônio Jorge 106 300.00 <eof> CL 20 Read Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign (Cadastro, ’/mnt/floppy/cadastro.txt’); reset (Cadastro); read (Cadastro, Funcionario); . . . End. João Luiz 101 1234.56 Sérgio Tchao 102 1654.32 Carlos Augusto 103 789.00 Ana Julia 104 2345.67 Maria Augusta 105 899.91 Antônio Jorge 106 300.00 <eof> CL Funcionario.Nome : João Luiz Funcionario.Codigo : 101 Funcionario.Salario: 1234.56 Este comando transfere o conteúdo do primeiro registro para os campos do registro Funcionario. Além disso avança a CL para o próximo registro. 21 Read Program LeCadastro (input{teclado}, output{vídeo}, Cadastro{e}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign (Cadastro, ’/mnt/floppy/cadastro.txt’); reset (Cadastro); read (Cadastro, Funcionario); read (Cadastro, Funcionario); . . . End. João Luiz 101 1234.56 Sérgio Tchao 102 1654.32 Carlos Augusto 103 789.00 Ana Julia 104 2345.67 Maria Augusta 105 899.91 Antônio Jorge 106 300.00 <eof> CL Funcionario.Nome : Sérgio Tchao Funcionario.Codigo : 102 Funcionario.Salario: 1654.32 22 Write O comando write escreve o conteúdo de uma variável, constante ou expressão no arquivo. Esta variável, constante ou expressão deve ter o mesmo tipo dos elementos do arquivo. Ao ser aberto para escrita (comando rewrite), o arquivo está vazio e a cabeça de gravação (CG) é inicializada na primeira posição do arquivo. O comando write grava o valor da variável na posição apontada pela cabeça de gravação e avança este ponteiro uma posição. 23 Write Program CriaCadastro (input{teclado}, output{vídeo}, Cadastro{s}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign(Cadastro, ’/mnt/floppy/cadastro.txt’); rewrite(Cadastro); . . . End. CG Este comando abre o arquivo Cadastro para gravação e posiciona a cabeça de gravação na primeira posição do arquivo. 24 Write Program CriaCadastro (input{teclado}, output{vídeo}, Cadastro{s}); . . . Type . . . Arquivo = file of Registro; Var Cadastro : Arquivo; Funcionario : Registro; Begin assign(Cadastro, ’/mnt/floppy/cadastro.txt’); rewrite(Cadastro); Funcionario.Nome:=’João Luiz’; Funcionario.Codigo:=101; Funcionario.Salario:=1234.56; write (Cadastro, Funcionario); . . . End. Este comando grava o conteúdo da variável Funcionario no arquivo, na posição apontada por CG, e avança a CG uma posição. João Luiz 101 1234.56 CG 25 A Função EOF ("End Of File") A função EOF(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo tipado, retorna true se o fim do arquivo tiver sido atingido ou se o arquivo estiver vazio, em caso contrário, retorna false. 26 A Função FileSize A função FileSize(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo tipado, retorna um inteiro contendo o número total de registros deste arquivo. 27 Este programa lista os nomes de todos os funcionários armazenados no arquivo que contém o cadastro da empresa. Program ListaNomes (input{teclado}, output{vídeo}, Cadastro{e}); Uses crt; Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Arq_Tipado = file of Registro; Var Cadastro : T_Arq_Tipado; Begin End. 28 Program ListaNomes (input{teclado}, output{vídeo}, Cadastro{e}); Uses crt; Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Arq_Tipado = file of Registro; Var Cadastro : T_Arq_Tipado; Begin assign (Cadastro, ’cadastro’); LeListaNomes(Cadastro); End. 29 Program ListaNomes (input{teclado}, output{vídeo}, Cadastro{e}); Uses crt; Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Arq_Tipado = file of Registro; Procedure LeListaNomes(Var ArqCadastro{e}: T_Arq_Tipado ); begin end; Var Cadastro : T_Arq_Tipado ; Begin assign (Cadastro, ’cadastro’); LeListaNomes(Cadastro); End. 30 Program ListaNomes (input{teclado}, output{vídeo}, Cadastro{e}); . . . Procedure LeListaNomes(Var ArqCadastro{e}: T_Arq_Tipado ); var Funcionario : Registro; begin clrscr; reset(ArqCadastro); while not eof(ArqCadastro) do begin read(ArqCadastro, Funcionario); writeln(output, Funcionario.Nome); end; close(ArqCadastro); end; . . . Begin . . . End. 31 Este programa grava em um arquivo os dados de uma agenda digitados no teclado. Program GravaAgenda (input{teclado}, output{vídeo}, Agenda{s}); Type Registro = record Nome : string [20]; Telefone : string [8]; Endereco : string [50]; end; T_Arq_Tipado = file of Registro; Var Agenda : T_Arq_Tipado; Begin End. 32 Program GravaAgenda (input{teclado}, output{vídeo}, Agenda{s}); TypeRegistro = record Nome : string [20]; Telefone : string [8]; Endereco : string [50]; end; T_Arq_Tipado = file of Registro; Var Agenda :T_Arq_Tipado; Begin assign(Agenda, ’ArqAgenda’); LeDadosGravaAgenda(Agenda); End. 33 Program GravaAgenda (input{teclado}, output{vídeo}, Agenda{s}); Type Registro = record Nome : string [20]; Telefone : string [8]; Endereco : string [50]; end; T_Arq_Tipado = file of Registro; Procedure LeDadosGravaAgenda (Var Arq{s}: T_Arq_Tipado); begin end; Var Agenda : T_Arq_Tipado; Begin assign(Agenda, ’ArqAgenda’); LeDadosGravaAgenda(Agenda); End. 34 Procedure LeDadosGravaAgenda (Var Arq{s}:T_Arq_Tipado); var Entrada : Registro; begin rewrite (Arq); write(output, ’Primeiro Nome: ’); readln (input, Entrada.Nome); while Entrada.Nome <> ’fim’ do begin write(output, ’Telefone e Endereço do ’, Entrada.Nome); readln(input, Entrada.Telefone, Entrada.Endereco); write(Arq, Entrada); write(output, ’Próximo Nome: ’); readln(input, Entrada.Nome) end; close (Arq); end; 35 Acesso Seqüencial e Acesso Direto O tipo de acesso utilizado até o momento é chamado seqüencial, no qual, para um registro ser lido, todos os registros anteriores, desde o primeiro registro do arquivo, têm que ser lidos. No acesso direto, também chamado aleatório ou randômico, os registros podem ser lidos ou escritos diretamente, sem ter que passar por todos os registros anteriores. Para realizar o acesso direto a um arquivo, utiliza-se o comando seek para posicionar a cabeça de leitura/escrita na posição desejada. 36 Seek O comando seek (NomeArq, Pos) posiciona a cabeça de leitura/escrita na posição Pos do arquivo NomeArq. A enumeração dos registros começa de zero. Portanto, seek(NomeArq,N) posiciona a cabeça de leitura/escrita no registro de número N, que na realidade é o (N+1)-ésimo registro do arquivo. Para que o comando seek possa ser utilizado, o arquivo deve ser aberto com o comando reset, podendo ser utilizado para leitura e/ou gravação. 37 Este programa imprime o nome do funcionário que possui código informado pelo teclado e duplica seu salário no arquivo. Considera-se que os códigos variam de 1 até N, onde N é o número total de funcionários, e que os registros estão ordenados pelo código. Program Duplica (input{teclado}, output{vídeo}, Cadastro{e/s}); Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Dados = file of Registro; Var Cadastro : T_Dados; Begin End. 38 Program Duplica(input{teclado}, output{vídeo}, Cadastro{e/s}); Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Dados = file of Registro; Var Cadastro: T_Dados; Begin assign (Cadastro, ’cadastro’); AtualizaSalario(Cadastro); End. 39 Program Duplica (input{teclado}, output{vídeo}, Cadastro{e/s}); Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; T_Dados = file of Registro Procedure AtualizaSalario(Var ArqCadastro{e/s}: T_Dados); begin end; Var Cadastro : T_Dados; Begin assign (Cadastro, ’cadastro’); AtualizaSalario(Cadastro); End. 40 Procedure AtualizaSalario(Var ArqCadastro{e/s}: T_Dados); var Funcionario : Registro; cod : Dominio; begin reset(ArqCadastro); write(output, ’Entre com o código do funcionário: ’); readln(input, cod); if (cod > 0) and (cod<=FileSize(ArqCadastro)) then begin seek(ArqCadastro, cod-1); read(ArqCadastro, Funcionario); writeln(output, Funcionario.Nome); Funcionario.Salario:= Funcionario.Salario * 2; seek(ArqCadastro, cod-1); write(ArqCadastro, Funcionario) end; close(ArqCadastro); end; 41 O comando append não pode ser utilizado em um arquivo tipado. Porém, o efeito deste comando pode ser obtido utilizando-se o comando seek e a função FileSize da seguinte maneira. Append Program Adicionando (Arq{s}); Var Arq: file of integer; Begin assign(Arq, ’numeros’); reset(Arq); seek(Arq, FileSize(Arq)); write(Arq, 999); close(Arq); End. 42 A função FilePos(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo tipado, retorna o número do registro sendo referenciado pela cabeça de leitura/gravação. Portanto, o retorno desta função é um número no intervalo: 0, 1, 2, ..., FileSize(NomeArquivo). A Função FilePos 43 Este programa escreve todas as posições de ocorrência de um dado número real em um arquivo de números reais. Program Manipula(input{teclado}, output{vídeo}, AR{e}); Var AR: file of real; Procurado, Atual: real; Begin write(output, ’Diga o nome do arquivo: ’); readln(input, nome); Assign(AR, nome); Reset(AR); write(output, ’Procurar por: ’); readln(input, Procurado); while not eof(AR) do begin read(AR, Atual); if Atual=Procurado then writeln(output, ’Posição: FilePos(AR)-1); end; Close(AR); End. 44 A operação ERASE(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo, apaga o arquivo externo associado a NomeArquivo (via assign). Observação: o arquivo deve estar fechado. O Procedimento ERASE 45 Utilizando o ERASE Program Cria_e_destroi(input{teclado}, output{vídeo}, AR{s}); Var AR: file of real; Begin write(output, ’Diga o nome do arquivo: ’); readln(input, nome); Assign(AR, nome); Rewrite(AR); {Cria Nome no seu diretório} write(AR, 13.31); {insere o primeiro registro em AR} write(AR, 3000.17); {insere o segundo registro em AR} Close(AR); Erase(AR); {Apaga o arquivo Nome do diretório} End. 46 Professores: Dante Corbucci Filho Alexandre Plastino Aula 11 Conteúdo: - Tipos Estruturados (4a- Parte) - Arquivos Tipados (File)
Compartilhar