Computação Eletrôica (1 Giga Byte) Processador (Itel Petium) Disco ou HD (100 Giga Bytes) Por que temos 2 memórias? HD: permaete (pode desligar o computador), barato e leto O HD é represetado por um cilidro RAM: volátil (ao desligar o computador, perde tudo), caro e rápido Até o mometo, todos os programas Pascal usavam apeas a memória RAM As variáveis são armazeadas a memória RAM Supoha um programa Pascal que lê o ome e a ota de 70 aluos armazeado em 2 vetores. Se o computador for desligado o meio da digitação, todos os dados são perdidos Pior: assim que o programa termiar, todos os dados são perdidos também Como fazer para salvar estas iformações o disco? Ou seja, como maipular arquivos em Pascal? 1
Não cofuda: s que cotém um programa Pascal Este arquivos, por exemplo, helloworld.pas, são compilados (traduzidos) para helloworld.exe. Se você der 2 cliques em helloworld.exe o programa executará. s criados por um programa Pascal São arquivos que cotém dados como iteiros, reais, ome de aluo, otas, úmero de matrícula, sócios de clubes, etc. Não podem ser lidos pelo Widows. Duplo clique eles ão resultam em ada. Apeas programas Pascal coseguem ler estes arquivos (acessar suas iformações). No disco (ou HD) é ode ficam armazeados os arquivos Todas estas pastas e estes arquivos estão armazeados o disco. Ou seja, você pode desligar o computador sem perder esses dados. Pascal cosegue maipular arquivos Todo arquivo em Pascal possui um tipo Por exemplo, arquivo do tipo iteiro, ou arquivo do tipo real, etc. Um arquivo do tipo iteiro, armazea vários úmeros iteiros Um arquivo do tipo real, armazea vários úmeros reais Um arquivo do tipo aluo armazea vários aluos Todo arquivo Pascal também possui um ome (assim como todo arquivo de qualquer computador) Todo arquivo Pascal possui, o fial, um símbolo de fim de arquivo (eof) 2
Exemplo de um arquivo Pascal cujo ome é Este arquivo pode ser salvo em qualquer pasta do seu Widows. No caso abaixo, a pasta é My Documets Como este arquivo foi parar aí? Calma Aguarde os próximos slides. O que cotém um arquivo de iteiros? Se pudéssemos ver seu coteúdo, seria mais ou meos assim: de iteiros que cotém os úmeros 15, 3 e 1. eof: Símbolo especial que idica o fim do arquivo. Todo arquivo Pascal tem este símbolo o fial Como maipular arquivos em Pascal? 1. Associar uma variável do tipo file ao ome do arquivo 2. Trasferir o coteúdo do arquivo do HD para a memória 3. Ler ou gravar dados a variável (através de read ou write) 4. Trasferir o coteúdo da memória para o arquivo o HD 1. Associar uma variável do tipo file ao ome do arquivo var : file of iteger; : iteger; Assig(, '); O programa cotiua os próximos slides. Este comado apeas diz ao Pascal: a variável será usada para maipular um arquivo cujo ome é Este comado ão cria um arquivo. Este comado ão traz um arquivo para a memória. Ele apeas iforma o ome do arquivo o HD quer será maipulado através da variável 3
arquivo está o HD arquivo está o HD 2. Trasferir o coteúdo do arquivo o HD para a memória var : file of iteger; : iteger; Assig(, '); Reset(); HD Reset() trasfere do HD o coteúdo do arquivo cujo ome é para a memória. O coteúdo do arquivo fica área de memória da variável. 2. Trasferir seu coteúdo para a memória var : file of iteger; : iteger; Assig(, '); Reset(); Para maipular arquivos, Pascal automaticamete defie em que posição o arquivo se ecotra. O reset(), além de trasferir o coteúdo do arquivo do HD para a memória, também defie a posição como sedo zero. Neste caso, a posição zero cotém o úmero 15. arquivo está o HD arquivo está o HD 3. Ler ou gravar dados a variável var : file of iteger; : iteger; Assig(, '); Reset(); read(,); Read(,) Read(,) lê o úmero a posição correte de (o caso, 15) e copia este valor para a variável. Pascal automaticamete adiata a posição do arquivo. 15 3. Ler ou gravar dados a variável var : file of iteger; : iteger; Assig(, '); Reset(); read(,); write(,); 15 write(,) grava o valor de a posição correte de. Pascal automaticamete adiata a posição do arquivo. write(,) 15 15 1 eof 15 4
arquivo está o HD 4. Trasferir o coteúdo da memória para o arquivo o HD var : file of iteger; : iteger; Assig(, '); Reset(); read(,); write(,); close(); 15 15 1 eof 15 15 15 1 eof close() trasfere o coteúdo da variável para o arquivo cujo ome é. Após o close(), o arquivo ão está mais associado à variável. HD E se quisermos criar um ovo arquivo? var : file of iteger; Assig(, '); Rewrite(); eof eof HD Rewrite() cria o HD um arquivo vazio (só com o eof) cujo ome é e trasfere seu coteúdo para a memória. O coteúdo do arquivo fica área de memória da variável. E se quisermos criar um ovo arquivo? var : file of iteger; Assig(, '); Rewrite(); write(,30); eof write(,30) 30 eof write(,30) iclui um ovo úmero (este caso, 30) à variável. A posição é adiatada automaticamete. E se quisermos criar um ovo arquivo? var : file of iteger; Assig(, '); Rewrite(); write(,30); write(,2); 30 eof write(,30) 30 2 eof write(,2) iclui um ovo úmero (este caso, 2) à variável. A posição é adiatada automaticamete. 5
E se quisermos criar um ovo arquivo? var : file of iteger; : iteger; Assig(, '); Rewrite(); write(,30); write(,2); close(); 30 2 eof 30 2 eof close() trasfere o coteúdo da variável para o arquivo cujo ome é. Após o close(), o arquivo ão está mais associado à variável. A posição de um arquivo é um úmero que vai de 0 (iício) à N (eof). 30 2 Eof Pos 0 1 2 HD A fução filepos(arquivo) retora a posição correte do arquivo (sem alterá-la). A fução seek(arquivo,) posicioa o arquivo a posição. 30 2 Eof Pos 0 1 2 Devemos ter cuidado ao atualizar um arquivo. Atualizar sigifica ler um dado do arquivo, modificá-lo e gravar a modificação. Como read automaticamete avaça a posição correte do arquivo, temos que sempre voltar uma posição ates de usar write. 6
{Criar um arquivo de iteiros.} var arquivo: file of iteger; Assig(arquivo,'meuPrimeiro.arq'); Rewrite(arquivo); Close(arquivo); {Cria e grava um arquivo de iteiros.} Program arquivo2; var arquivo: file of iteger; i,: iteger; Assig(arquivo,'quadrados.arq'); Rewrite(arquivo); for i := 1 to 50 do := i * i; write(arquivo,); ed; Close(arquivo); {Lê um arquivo de iteiros.} Program arquivo3; var arquivo: file of iteger; i,: iteger; Assig(arquivo,'quadrados.arq'); Reset(arquivo); while ot(eof(arquivo)) do read(arquivo,); writel(); ed; readl; Close(arquivo); {Atualiza um arquivo de iteiros.} Program arquivo3_5; var arquivo: file of iteger; i,,dobro: iteger; Assig(arquivo,'quadrados.arq'); Reset(arquivo); while ot(eof(arquivo)) do read(arquivo,); dobro := 2 * ; seek(arquivo,filepos(arquivo)-1); write(arquivo,dobro); ed; Close(arquivo); 7
{Cria um arquivo com registros} { Program arquivo4; type aluo = record mat: iteger; cpf: iteger; ed; var arquivo: file of aluo; a: aluo; i: iteger; Assig(arquivo,'aluos.arq'); Rewrite(arquivo); for i := 1 to 5 do write('etre a matricula e o cpf: '); readl(a.mat,a.cpf); write(arquivo,a); ed; close(arquivo); Programa que lê o primeiro úmero de um arquivo e atualiza-o com seu valor mais 5. Program atualiza; var arquivo: file of iteger;, pos: Iteger; Assig(arquivo, arquivodeiteiros.dad ); Reset(arquivo); Read(arquivo, ); { recebe o primeiro umero do arquivo.} {Porem, read avacou a posicao do arquivo. Temos que voltar 1 posicao} pos := filepos(arquivo); {guarda em pos a posicao atual do arquivo} pos := pos - 1; {calcula a posicao aterior} seek(arquivo,pos); {posicioa o arquivo a posicao aterior} := +5; {calcula o ovo valor de } write(arquivo,); {atualiza } close(arquivo); {Cosulta um arquivo pela mat, retorado a mat e cpf} Program arquivo6; type aluo = record mat: iteger; cpf: iteger; ed; var arquivo: file of aluo; a: aluo; matricula: iteger; Assig(arquivo,'aluos.arq'); Reset(arquivo); write('etre a matricula: '); readl(matricula); while ot(eof(arquivo)) do read(arquivo,a); if (a.mat = matricula) the writel('matricula: ',a.mat,' CPF: ',a.cpf); writel('sua posicao o arquivo eh: ',filepos(arquivo)-1); ed; ed; close(arquivo); 8