A maior rede de estudos do Brasil

Grátis
146 pág.
Programando com PASCAL - Jaime Evaristo

Pré-visualização | Página 39 de 50

begin
Assign(Arq, 'A:Quadrados');
Rewrite(Arq);
for i := 1 to 50 do
begin
Quad := i*i;
write(Arq, Quad);
end;
end.
Após a execução deste programa, a exibição do conteúdo do disco contido na unidade A vai mostrar a 
existência de um arquivo denominado Quadrado com um tamanho de 100 Bytes. A adoção da denominação 
Quadrado e não Quadrados, como estabelecido no comando Assign, se dá pelo fato de que a interação do 
Pascal com discos é feita pelo sistema operacional DOS, que não aceita um identificador de arquivo com 
mais de oito caracteres.
Para um outro exemplo, poderíamos reescrever o programa GeraArquivo acima, para que, logo após a 
criação do arquivo Folha.arq, os dados pretendidos fossem armazenados:
{Programa para gerar um arquivo e gravar dados no arquivo gerado}
program GeraArquivo;
type TRegistro = record
Matr : string[9];
Nome : string[40];
SalarioBruto, SalarioLquido, Inss : real;
NumDepend : integer;
end;
TArquivo = file of TRegistro;
var Arq : TArquivo;
{Procedimento para gravar dados num arquivo}
procedure GravaDados(var f : TArquivo);
var r : TRegistro;
begin
with r do
repeat
writeln('Digite matricula, nome, salario e numero de dependentes (0 para encerrar)');
readln(Matr);
if Matr <> '0'
then
begin
readln(Nome, SalarioBruto, NumDepend);
write(f, r);
end;
until Matr = '0';
end;
{Programa principal}
begin
Assign(Arq, 'A:Folha.arq');
Rewrite(Arq);
GravaDados(Arq);
end.
É importante observar que os registros são gravados seqüencialmente e o sistema indexa cada um deles 
com os índices 0, 1, 2, ..., de acordo com a ordem em que eles foram gravados.
Vale observar, também, que o procedimento write é o mesmo que vimos usando para exibir a saída dos 
programas no vídeo. Isto sempre acontece quando o parâmetro f é omitido. Um outro detalhe importante é 
que o sistema contém um arquivo Lst que gerencia o relacionamento do sistema com a impressora conectada 
ao computador. Quando o arquivo Lst é passado como argumento para o comando write, o conteúdo do 
argumento passado para o segundo parâmetro é impresso. Este arquivo pertence à unidade Printer e a sua 
utilização exige que esta unidade seja relacionada na lista das unidades a serem utilizadas pelo programa.
Por exemplo, a execução do programa 
{Programa para gerar uma tabela de conversão de temperaturas em graus fahrenheit para graus 
Celsius}
program TabelaDeConversaoFarenheitCelsius;
uses Crt;
var Farenheit : integer;
 Celsius: real;
begin
writeln(Lst, 'Tabela de conversao de temperaturas');
writeln(Lst, '--------------------------------------------');
writeln(Lst, ' Farenheit | Celsius');
writeln(Lst, '--------------------------------------------');
for Farenheit := 20 to 80 do
begin
Celsius := 5.0*(Farenheit - 32)/9;
writeln(Lst, ' ', Farenheit,' ', Celsius:0:2);
end;
end.
imprimiria a tabela da página 72.
8.3.5 Abrindo e fechando um arquivo
A realização de operações num arquivo exige que ele esteja disponibilizado para tal. O ato de 
disponibilizar um arquivo para nele realizar operações é chamado abertura do arquivo, que em Pascal é feito 
através do procedimento
Reset(var f : TArquivo);
Naturalmente, o arquivo a ser aberto é aquele cujo nome foi associado ao parâmetro f por um 
procedimento Assign, cuja ativação deve preceder a ativação do comando. Naturalmente, também, a ativação 
de um procedimento Reset para um arquivo que não existe provoca um erro de execução. 
É prudente então se preceder a ativação de um procedimento Reset de uma função que verifique a 
existência do arquivo que se pretende abrir. Isto pode ser feito com uma função como a que apresentamos a 
seguir.
function ExisteArquivo(var f : TArquivo) : boolean;
begin
{$I-}
Reset(f);
if IOResult = 0
then ExisteArq := true
else ExisteArq := false;
{$I+}
end;
A expressão {$I-} é uma diretiva de compilação e o objetivo de uma instrução como esta é definir como 
a compilação do programa deve ser realizada. A diretiva {$I-} inibe a verificação de erros de entrada e saída 
que aconteceria se o arquivo associado à variável passada para f não existisse. A função IOResult é uma 
função predefinida que retorna 0 (zero) se a ultima operação de entrada/saída foi realizada com sucesso. A 
função é encerrada com {$I+} para reativar a verificação de erros de entrada e saída pelo sistema. 
A função ExisteArq pode ser utilizada quando se pretende criar um arquivo novo, para evitar a destruição 
de um arquivo já existente, conforme foi discutido na apresentação do comando Rewrite. Desta forma seria 
interessante que o programa GeraArq discutido acima fosse modificado para a seguinte versão:
{Programa para gerar um arquivo}
program GeraArquivo;
type TRegistro = record
Matr : string[9];
Nome : string[40];
SalarioBruto, SalarioLquido, Inss : real;
NumDepend : integer;
end;
TArquivo = file of TRegistro;
var Arq : TArquivo;
{Funcao para verificar a existencia de um arquivo}
function ExisteArquivo(var f : TArquivo): boolean;
begin
{$I-}
Reset(f);
if IOResult = 0
then ExisteArquivo := true
else ExisteArquivo := false;
{$I+}
end;
{Procedimento para gravar dados num arquivo}
procedure GravaDados(var f : TArquivo);
var r : TRegistro;
begin
with r do
repeat
writeln('Digite matricula, nome, salario e numero de dependentes (0 encerra)');
readln(Matr);
if Matr <> '0'
then
begin
readln(Nome, SalarioBruto, NumDepend);
write(f, r);
end;
until Matr = '0';
end;
{Programa principal}
begin
Assign(Arq, 'A:Folha.arq');
if not ExisteArquivo(Arq)
then
begin
Rewrite(Arq);
GravaDados(Arq);
end
else
writeln('Arquivo A:Folha.arq ja existe');
end.
Embora ainda não tenhamos feito, é necessário que todo arquivo criado por um procedimento Rewrite ou 
aberto por um procedimento Reset seja fechado para que o sistema operacional DOS realize as atualizações 
necessárias, inclusive na tabela de diretórios. Esta ação é obtida com o procedimento 
Close(var f : TArquivo);
que deve ser ativado em relação a todos os arquivos abertos ou criados pelo programa.
8.3.6 Exibindo o conteúdo de um arquivo
A exibição no vídeo ou a impressão do conteúdo de um arquivo requer que cada registro seja 
armazenado na memória do computador para, em seguida, ser exibido ou impresso por um comando writeln, 
sem argumento do tipo Tarquivo para exibição no vídeo, ou com o argumento Lst para impressão. O 
armazenamento na memória de um registro gravado num arquivo é feito através do procedimento
read(var f : TArquivo; v : tipo de dado);
onde tipo de dado é o tipo do registro do arquivo. A execução deste procedimento redunda na "leitura" dos 
dados do registro disponibilizado para tal e o conseqüente armazenamento destes dados na variável v. 
Quando se abre um arquivo com o procedimento Reset, o registro disponível para leitura é o primeiro 
registro que foi gravado no arquivo, ou seja, o registro de índice zero. O registro disponibilizado para leitura 
(e para gravação) é chamado registro corrente e dizemos que o ponteiro de leitura e gravação aponta para o 
tal registro. Após a execução de um procedimento read, o ponteiro de leitura e gravação avança para o 
registro seguinte. O sistema possui a função 
Eof (var f : TArquivo) : boolean;
que retorna true quando o final do arquivo é atingido. Isto acontece após a leitura do último registro gravado, 
após a execução de um procedimento Rewrite e após a execução de um comando Reset em um arquivo onde 
dados não foram gravados.
A exibição do conteúdo de um arquivo pode ser feita abrindo-se o arquivo por um Reset e, em seguida, 
percorrendo-o até o seu final e combinado-se os comandos read e writeln:
{Procedimento para exibir o conteudo de um arquivo}
procedure ExibeArquivo(var f : TArquivo);
var