Aula 21: Ficheiros


Comunicar com ficheiros

Hoje vamos aprender como escrever e ler ficheiros. Neste aula vamos só usar ficheiros do tipo texto. Isto são ficheiros com os dados no formato ASCII e legível pelas pessoas enquanto que os outros formatos são do tipo binário e só legível pelo computador. Todos os nossos ficheiros com os programas de PASCAL são do tipo ASCII.
Podemos ler e escrever ficheiros na disquete ou disco rigido ou mesmo do CD-ROM (neste caso - obviamente - é só possível ler os ficheiros).

Instruções

As seguintas instruções de PASCAL são relacionado ao acesso dos ficheiros:
 
 Var text
 Assign
 Rewrite
 Reset
 Close
 Read, ReadLn
 Write, WriteLn
 Eol, Eof


Declarar ficheiros:

Antes de abrir um ficheiro temos de especificar um variável que vai guardar a informação do ficheiro. Em PASCAL a declaração é assim:
 
 Var filehandle: text; 

Com filehandle o nome da variável que contem o estado do ficheiro. Isto não é igual ao nome do ficheiro, mas é só uma variável que vai guardar a informação do estado do mesmo (por exemplo: onde fica no disco?, está aberto?, a última unidade da informação).
O lugar de declarar este variável é com a declaração das outras variáveis.
Example:
  Var f: text;


Atribuir um nome

Dentro do programa temos de especificar o nome (como está no disco) antes de abrir o ficheiro:
 
 Assign(filehandle,filename); 

O filehandle é igual à variável acima e filename é um string (constante ou variável) que contem o nome do ficheiro. Por exemplo:
  Assign(f, 'MYFILE.TXT');

  ReadLn(s);
  Assign(f, s);


Input ou output?

Para abrir o ficheiro, existem duas formas. A escolha da forma depende do tipo da comunicação input (ler) ou output (escrever):
 
 Reset(filehandle); 
 Rewrite(filehandle); 
Por exemplo:
  Reset(f);
  Rewrite(f);

Ler e escrever

Ler e escrever é igual a ler e escrever através o teclado e o ecrã, respectivamente. Usamos as mesmas instruções (Read, ReadLn, Write, and WriteLn). A única diferença é que leve mais um parâmetro, nomeademente o ficheiro:
 
 Read(filehandle,...); 
 ReadLn(filehandle,...); 
 Write(filehandle,...); 
 WriteLn(filehandle,...); 

Nota que podemos só usar as instruções Read e ReadLn para ficheiros que foram abertos para input (por Reset).  Da mesma forma as instruções Write e WriteLn é para escrever nos ficheiros que estão preperados para output (por Rewrite). Exemplos:
  WriteLn(f, r:0:2);
  ReadLn(f, opcao);
 

Ler uma variável com o teclado
Ler uma variável de um ficheiro


Fechar o ficheiro

Quando estamos pronto com o acesso do ficheiro temos de fechar-o. Isto é especialmente importante para ficheiros de output. Se esquecemos de fechar o ficheiro os dados no ficheiro não estarão completos. Fechar um ficheiro fazemos assim:
 
 Close(filehandle); 
por exemplo:
  Close(f);

Resumo

Escrever e ler um ficheiro tem sempre os seguintes passos:


Eol, Eof

Duas instruções úteis sãol
Eol(filehandle): retorna TRUE se estamos a ler no fim da linha.
Eof(filehandle): retorna TRUE se estamos a ler no fim do ficheiro.

Exemplo:
  While NOT Eof(f) do
    ReadLn(s);
o que vai ler até o fim do ficheiro.


Exemplos

código PASCAL  ecrã  ficheiro TEST.TXT
após de correr o programa
PROGRAM WithFileOutPut;

Var f: text;
    s: string;
    i: integer;

begin
  WriteLn('Nome do Ficheiro:');
  ReadLn(s);
  Assign(f, s);
  Rewrite(f);
  for i := 1 to 10 do
    WriteLn(f, i, ' Ola');
  Close(f);
end.

Nome do Ficheiro:
TEST.TXT
1 Ola
2 Ola
3 Ola
4 Ola
5 Ola
6 Ola
7 Ola
8 Ola
9 Ola
10 Ola

 
código PASCAL  ecrã  ficheiro TEST.TXT antes
de correr o programa
PROGRAM WithFileInPut;

Var f: text;
    c: char;
    s: string;
    i: integer;

begin
  WriteLn('Nome do Ficheiro:');
  ReadLn(s);
  Assign(f, s);
  Reset(f);
  While NOT Eof(f) do
    begin
       (* le um caractere: *) 
      Read(f, c);
       (* mostra no ecran: *) 
      Write(c);
    end;
  Close(f);
end.

Nome do Ficheiro:
TEST.TXT
1 Ola
2 Ola
3 Ola
4 Ola
5 Ola
6 Ola
7 Ola
8 Ola
9 Ola
10 Ola
1 Ola
2 Ola
3 Ola
4 Ola
5 Ola
6 Ola
7 Ola
8 Ola
9 Ola
10 Ola


Peter Stallinga. Universidade do Algarve, 30 Abril 2002