Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Professores: Dante Corbucci Filho Alexandre Plastino Conteúdo: - Tipos Estruturados (3a_ Parte) - Arquivos Texto (Text) Aula 10 2 Arquivo Texto (Text) Os programas apresentados neste curso até o momento são chamados interativos. Programas interativos lêem os dados de entrada do teclado e apresentam os dados de saída na tela. Este tipo de programação é utilizada quando poucos dados são processados. Quando grandes quantidades de dados são processadas, arquivos são utilizados para armazenar os dados de entrada e os de saída. Estes são chamados, respectivamente, arquivos de entrada e arquivos de saída. 3 Arquivo Texto (Text) 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. Arquivos texto podem ser criados, visualizados e alterados por editores ou processadores de texto. Desta forma, o arquivo de entrada de um programa pode ser criado em um editor de texto e o arquivo de saída pode ser consultado utilizando-se também um editor. 4 Arquivo Texto (Text) Um arquivo texto é armazenado em disco como uma seqüência de caracteres. O arquivo acima contém 30 caracteres (ou bytes), entre eles, dígitos, brancos, letras, e dois caracteres especiais: <eoln> e <eof>. O caracter <eoln> (end-of-line) indica fim de linha e o caracter <eof> (end-of-file) indica fim do arquivo. 1 2 5 9 4 A l e x L i n o <eoln> <eoln> <eof>3 7 0 5 1 S y l v i a 5 Arquivo Texto (Text) Um arquivo texto pode ter vários caracteres <eoln> mas apenas um <eof>. Durante a edição de um arquivo, um caracter <eoln> é inserido sempre que a tecla <Enter> é digitada e, quando o arquivo é salvo, um caracter <eof> é gravado após o último caracter do arquivo. 1 2 5 9 4 A l e x L i n o <eoln> <eoln> <eof>3 7 0 5 1 S y l v i a 6 Arquivo Texto (Text) O arquivo acima seria exibido em um editor de texto como a figura abaixo. Os caracteres <eoln> e <eof> não são exibidos, apenas indicam fim de linha e fim do arquivo. Para futuros exemplos, considere que o nome deste arquivo é "cadastro.txt". 1 2 5 9 4 A l e x L i n o <eoln> <eoln> <eof>3 7 0 5 1 S y l v i a 12594 Alex Lino 37051 Sylvia 7 Variável tipo text Para utilizar (ler ou gravar) um arquivo texto em Pascal, é necessário declarar uma variável que represente este arquivo (variável do tipo arquivo). Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Var Dados : text; . . . Begin . . . End. Declaração da variável Dados que representa o arquivo. Lista dos dispositivos e arquivos de entrada e saída. 8 Assign O comando Assign permite que um arquivo em disco seja associado a uma variável do tipo arquivo. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Var Dados : text; . . . Begin assign (Dados, ’/mnt/floppy/dirdados/cad.txt’); . . . End. Nome interno do arquivo. Variável que representa o arquivo. Nome externo do arquivo. Localização completa do arquivo. A partir deste ponto, a variável Dados se refere ao arquivo cad.txt armazenado no disquete, no diretório dirdados. 9 Assign No comando Assign a identificação do arquivo em disco pode ser feita por uma variável do tipo string. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Var Dados : text; NomeArquivo: string; . . . Begin write (output, ’Entre com o nome do arquivo de dados: ’); readln (input, NomeArquivo); assign (Dados, NomeArquivo); . . . End. 10 Abrindo um arquivo texto Antes de ser utilizado (como entrada ou saída), um arquivo texto precisa ser aberto. Um arquivo texto não pode ser aberto tanto para leitura quanto para gravação. Se um arquivo texto é aberto para leitura, não se pode gravar nesse arquivo, e vice-versa. O comando Reset abre um arquivo texto para leitura (para entrada de dados). O comando Rewrite abre um arquivo texto para gravação (para saída de dados). 11 Reset O comando Reset permite que um arquivo texto seja aberto (preparado) para leitura. Toda vez que for necessário reler o arquivo, o comando Reset deverá ser executado novamente. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Var Dados : text; . . . Begin assign (Dados, ’/mnt/floppy/cadastro.txt’); reset (Dados); . . . End. Nome interno do arquivo. A partir deste ponto, o arquivo Dados pode ser lido. O primeiro caracter a ser lido será o primeiro caracter do arquivo (onde estará inicialmente a "cabeça de leitura"). 12 Rewrite O comando Rewrite permite que um arquivo texto 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 : text; . . . 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 caracter será gravado na primeira posição do arquivo. 13 Close O comando Close permite que um arquivo de entrada ou saída seja fechado. Sempre que não for mais ser utilizado, um arquivo deve ser fechado. Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); Var Resultado : text; . . . 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 no disquete. A partir deste ponto, o arquivo Resultado não poderá mais ser utilizado. 14 Read, Readln Os comandos Read e Readln lêem dados de um arquivo texto e os armazenam em variáveis do programa. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); Var Dados : text; Codigo : integer; Separador: char; Nome : string; Begin assign (Dados, ’/mnt/floppy/cadastro.txt’); reset (Dados); readln (Dados, Codigo, Separador, Nome); . . . End. Lista de variáveis. Nome interno do arquivo. Este comando transfere 12594 para a variável Codigo, ’ ’ para Separador e ’Alex Lino’ para Nome, além de consumir também o caracter <eoln>, posicionando a "cabeça de leitura" na próxima linha. 12594 Alex Lino<eoln> 37051 Sylvia<eoln> <eof> 15 Read, Readln Esta seqüência de comandos é equivalente à anterior (com um readln apenas). Program LeDados (input{teclado}, output{vídeo}, Dados{e}); . . . Begin assign (Dados, ’/mnt/floppy/cadastro.txt’); reset (Dados); read (Dados, Codigo, Separador, Nome); readln (Dados); . . . End. 12594 Alex Lino<eoln> 37051 Sylvia<eoln> <eof> Este read transfere 12594 para a variável Codigo, ’ ’ para Separador e ’Alex Lino’ para Nome. Este readln consome o caracter <eoln>, posicionando a "cabeça de leitura" na próxima linha. 16 Read, Readln Outra equivalência. Program LeDados (input{teclado}, output{vídeo}, Dados{e}); . . . Begin assign (Dados, ’/mnt/floppy/cadastro.txt’); reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln(Dados); . . . End. 12594 Alex Lino<eoln> 37051 Sylvia<eoln> <eof> Este readln consome o caracter <eoln>, posicionando a "cabeça de leitura" na próxima linha. Estes três comandos transferem 12594 para a variável Codigo, ’ ’ para Separador e ’Alex Lino’ para Nome. 17 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL = Cabeça de Leitura Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 18 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 19 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 20 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 21 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 22 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> CL Begin . . . reset (Dados); read (Dados, Codigo); read (Dados, Separador); read (Dados, Nome); readln (Dados); . . . End. Execução 23 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> Begin . . . reset (Dados); readln (Dados, Codigo); . . . End. Execução CL = Cabeça de Leitura 24 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> Execução CL Begin . . . reset (Dados); readln (Dados, Codigo); . . . End. 25 12594 Alex Lino<eoln> 37051 Sylvia<eoln><eof> Begin . . . reset (Dados); readln (Dados, Codigo); . . . End. Execução CL 26 Read, Readln O número de caracteres lidos em um comando Read ou Readln, a partir da "cabeça de leitura", depende do tipo das variáveis que estão recebendo os dados. Tipo char: apenas um caracter é consumido e armazenado na variável correspondente; 27 Read, Readln O número de caracteres lidos em um comando Read ou Readln, a partir da "cabeça de leitura", depende do tipo das variáveis que estão recebendo os dados. Tipo string: todos os caracteres até o último antes do próximo <eoln> são consumidos; apenas no caso de readln, o caracter <eoln> é consumido mas não armazenado; 28 Read, Readln O número de caracteres lidos em um comando Read ou Readln, a partir da "cabeça de leitura", depende do tipo das variáveis que estão recebendo os dados. Tipo numérico (integer ou real): todos os brancos e caracteres <eoln> são consumidos até que um caracter diferente destes seja encontrado. Se não for um sinal ou um dígito, um erro será retornado. Em caso contrário, os caracteres correspondentes ao inteiro ou ao real (inclusive o ponto) são consumidos e o número correspondente é armazenado na variável. 29 Exemplos Considere as quatro variáveis: R: real; I: integer; C: char; S: string; E o seguinte arquivo texto de entrada: 1234.56 789 A345.67<eoln> W<eoln><eof> CL 30 Exemplos A execução do comando read (Arquivo, R, I, C); Armazena os seguintes valores em R, I, C: 1234.56 789 A345.67<eoln> W<eoln><eof> CL R: 1234.56 I: 789 C: ’ ’ 31 Exemplos A execução do comando readln (Arquivo, R, I, C); Armazena os seguintes valores em R, I, C: R: 1234.56 I: 789 C: ’ ’ 1234.56 789 A345.67<eoln> W<eoln><eof> CL 32 Exemplos A execução do comando read (Arquivo, R, C, I); Armazena os seguintes valores em R, C, I: R: 1234.56 C: ’ ’ I: 789 1234.56 789 A345.67<eoln> W<eoln><eof> CL 33 Exemplos A execução do comando readln (Arquivo, R, C, I); Armazena os seguintes valores em R, C, I: R: 1234.56 C: ’ ’ I: 789 1234.56 789 A345.67<eoln> W<eoln><eof> CL 34 Exemplos A execução do comando read (Arquivo, C, R, I); Armazena os seguintes valores em C, R, I: C:1 R: 234.56 I: 789 1234.56 789 A345.67<eoln> W<eoln><eof> CL 35 Exemplos A execução do comando readln (Arquivo, C, R, I); Armazena os seguintes valores em C, R, I: C:1 R: 234.56 I: 789 1234.56 789 A345.67<eoln> W<eoln><eof> CL 36 Exemplos A execução dos comandos readln (Arquivo, R, I); read (Arquivo, C); Armazena os seguintes valores em R, I, C: R: 1234.56 I: 789 C: ’W’ 1234.56 789 A345.67<eoln> W<eoln><eof> CL 37 Exemplos A execução dos comandos readln (Arquivo, R); readln (Arquivo, C); Armazena os seguintes valores em R, C: R: 1234.56 C: ’W’ 1234.56 789 A345.67<eoln> W<eoln><eof> CL 38 Exemplos A execução dos comandos readln (Arquivo, S); readln (Arquivo, C); Armazena os seguintes valores em S, C: S: ’1234.56 789 A345.67’ C: ’W’ 1234.56 789 A345.67<eoln> W<eoln><eof> CL 39 Write, Writeln Os comandos Write e Writeln escrevem valores de variáveis, constantes ou expressões em um arquivo texto. Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); Var Resultado : text; Codigo : integer; Nome : string; Begin assign (Resultado, ’/mnt/floppy/resposta.txt’); rewrite (Resultado); readln (input, Codigo, Nome); writeln (Resultado, Codigo, ’ ’, Nome); . . . End. Este comando grava no arquivo Resultado os valores de Codigo e Nome lidos do teclado, intercalados com um branco. Um <eoln> é gravado após o Nome. 40 Write, Writeln Esta seqüência de comandos é equivalente à anterior (com um writeln apenas). Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); Var Resultado : text; . . . Begin assign (Resultado, ’/mnt/floppy/resposta.txt’); rewrite (Resultado); readln (input, Codigo, Nome); write (Resultado, Codigo); write (Resultado, ’ ’); write (Resultado, Nome); writeln (Resultado); . . . End. Estes três comandos gravam no arquivo Resultado os valores de Codigo e Nome lidos do teclado, intercalados com um branco. Estes comando grava o caracter <eoln> em seguida. 41 Write, Writeln Obs.: A formatação dos comandos Write e Writeln conforme vista na primeira aula pode ser utilizada também para escrever em arquivos texto. Program EscreveDados (input{teclado}, output{vídeo}, Resultado{s}); Var Resultado : text; Codigo : integer; Nome : string; Begin assign (Resultado, ’/mnt/floppy/resposta.txt’); rewrite (Resultado); readln (input, Codigo, Nome); writeln (Resultado, Codigo, ’ ’, Nome); . . . close (Resultado);End. O comando close grava o caracter <eof> no arquivo Resultado e o fecha. 42 Funções EOF e EOLN A função EOF(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo, retorna true se o próximo caracter neste arquivo for o caracter <eof>; em caso contrário, retorna false. A função EOLN(NomeArquivo), onde NomeArquivo é o nome interno de um arquivo, retorna true se o próximo caracter neste arquivo for o caracter <eoln>; em caso contrário, retorna false. 43 Programa para criar uma cópia de um arquivo. Program CriaCopia (input{teclado}, output{vídeo}, Orig{e}, Dest{s}); Var Orig, Dest : text; NomeOrig, NomeDest : string; Begin End. 44 Programa para criar uma cópia de um arquivo. Program CriaCopia (input{teclado}, output{vídeo}, Orig{e}, Dest{s}); Var Orig, Dest : text; NomeOrig, NomeDest : string; Begin LeNomesArquivos(NomeOrig,NomeDest); assign (Orig, NomeOrig); assign (Dest, NomeDest); CopiaArquivo(Orig,Dest); End. 45 Programa para criar uma cópia de um arquivo. Program CriaCopia (input{teclado}, output{vídeo}, Orig{e}, Dest{s}); Procedure LeNomesArquivos(Var Nome_O{s}, Nome_D{s} : string); begin end; Procedure CopiaArquivo(Var Arq_O{e}, Arq_D{s} : text); begin end; Var Orig, Dest : text; NomeOrig, NomeDest : string; Begin LeNomesArquivos(NomeOrig,NomeDest); assign (Orig, NomeOrig); assign (Dest, NomeDest); CopiaArquivo(Orig,Dest); End. 46 Programa para criar uma cópia de um arquivo. Program CriaCopia (input{teclado}, output{vídeo}, Orig{e}, Dest{s}); Procedure LeNomesArquivos(Var Nome_O{s}, Nome_D{s} : string); begin write (output, ’Entre com o nome do arquivo a ser copiado: ’); readln (input, Nome_O); write (output, ’Entre com o nome do novo arquivo cópia: ’); readln (input, Nome_D); end; . . . Begin LeNomesArquivos(NomeOrig,NomeDest); assign (Orig, NomeOrig); assign (Dest, NomeDest); CopiaArquivo(Orig,Dest); End. 47 Programa para criar uma cópia de um arquivo. Executável Código Fonte Program CriaCopia (input{teclado}, output{vídeo}, Orig{e}, Dest{s}); . . . Procedure CopiaArquivo(Var Arq_O{e}, Arq_D{s} : text); var Linha : string; begin reset (Arq_O); rewrite (Arq_D); while not eof(Arq_O) do begin readln (Arq_O, Linha); writeln (Arq_D, Linha); end; close (Arq_O); close (Arq_D); end; . . . Begin . . . End. 48 Programa para listar o conteúdo de uma tabela contendo o cadastro de funcionários de uma empresa. Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); Uses crt; Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; Tabela = array [Dominio] of Registro; Var BD : text; Cadastro : Tabela; NumFunc : integer; Begin End. 49 Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); Uses crt; Const MaxFunc = 1000; Type Dominio = 1 . . MaxFunc; Registro = record Nome : string [20]; Codigo : Dominio; Salario : real end; Tabela = array [Dominio] of Registro; . . . Var BD : text; Cadastro : Tabela; NumFunc : integer; Begin assign (BD, ’cadastro.txt’); LerCadastro(BD,Cadastro,NumFunc); ImprimirCadastro(Cadastro,NumFunc); End. 50 Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); . . . Procedure LerCadastro(Var Arquivo{e}: text; Var Cadastro{s}: ListaFuncionarios; Var NumFunc{s}: integer); begin end; Procedure ImprimirCadastro(Cadastro{e}: ListaFuncionarios; NumFunc{e}: integer); begin end; . . . Begin assign (BD, ’cadastro.txt’); LerCadastro(BD,Cadastro,NumFunc); ImprimirCadastro(Cadastro,NumFunc); End. 51 Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); . . . Procedure LerCadastro(Var Arquivo{e}: text; Var Cadastro{s}: ListaFuncionarios; Var NumFunc{s}: integer); begin end; . . . Begin assign (BD, ’cadastro.txt’); LerCadastro(BD,Cadastro,NumFunc); ImprimirCadastro(Cadastro,NumFunc); End. Esta rotina deverá ler os registros de um arquivo com o seguinte formato: Nome Código Salário Alex Lino da Silva 342 1245.55 Branca Carvalho 169 3449.90 Ana Maria Moura 20 300.00 52 Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); . . . Procedure LerCadastro(Var Arquivo{e}: text; Var Cadastro{s}: ListaFuncionarios; Var NumFunc{s}: integer); var i : integer; begin reset (Arquivo); i := 0; while (i<MaxFunc) and (not eof(Arquivo)) do begin i := i + 1; with Cadastro[i] do readln (Arquivo, Nome, Codigo, Salario) end; close (Arquivo); NumFunc := i; end; . . . 53 Program ListaCadastro (input{teclado}, output{vídeo}, BD{e}); Uses crt; . . . Procedure ImprimirCadastro(Cadastro{e}: ListaFuncionarios; NumFunc{e}: integer); var i : integer; begin Clrscr; {Este comando limpa a tela - contida na crt} writeln (output, ’Nome’, ’Código’ : 23, ’Salário’ : 21); for i := 1 to NumFunc do with Cadastro[i] do writeln (output, Nome, ’ ’ : 22 - lenght(Nome), Codigo : 3, Salario : 23 : 2) end; . . . Begin LerCadastro(BD,Cadastro,NumFunc); ImprimirCadastro(Cadastro,NumFunc); End. 54 Append O comando Append abre o arquivo texto existente para escrita e posiciona a "cabeça de escrita" no final do arquivo, permitindo escrever novas informações no final do arquivo. O arquivo deve estar associado previamente, via comando assign. Caso o arquivo externo associado não exista no diretório, um erro ocorrerá. Program Adicionando (Arq{s}); Var Arq: text; Begin assign(Arq, ’teste.txt’); rewrite(Arq); writeln(Arq, ’Minha primeira linha’); close(Arq); Append(Arq); writeln(Arq, ’Nova linha adicionada no final’); close(Arq); End. Executável Código Fonte 55 Erros, Diretivas {$I-} e {$I+}, Função IOResult Nos programas vistos até agora, um erro de entrada e saída que ocorra fará seu programa terminar em estado de erro (abortará). É possível se evitar este término abrupto do programa pelo uso das diretivas {$I-} e {$I+}. Todos os erros de entrada e saída que ocorrerem dentro de uma região do código delimitada por estas diretivas não abortarão o programa. Para sabermos qual foi o erro que ocorreu e podermos tratá-lo, a função IOResult deve ser utilizada, após a operação de entrada e saída desejada. Caso o valor retornadopor IOResult seja zero não houve erro; em caso contrário o número do erro é retornado. 56 Exemplo utilizando {$I-}, {$I+} e IOResult Executável Código Fonte Program Adiciona_Mais (Input{teclado}, Output{vídeo}, Arq{e/s}); Var Arq: Text; Caminho: String; Begin write(output, ’Diga o caminho e o nome do arquivo: ’); readln(input, Caminho); assign(Arq, Caminho); {$I-} Append(Arq); {$I+} if IOResult = 0 then writeln(Arq, ’Mais uma nova linha adicionada no final’) else begin rewrite(Arq); writeln(Arq, ’Minha primeira linha’); end close(Arq); End. 57 Professores: Dante Corbucci Filho Alexandre Plastino Aula 10 Conteúdo: - Tipos Estruturados (3a_ Parte) - Arquivos Texto (Text Files)
Compartilhar