A. Considerații teoretice

Se reamintește sintaxa pentru definirea unei variabile de tip fișier:

var VariabilaFisier: file of TipInregistrare;

Pentru deschiderea fișierului trebuie apelată procedura Assign, după care se apelează una dintre următoarele proceduri: Reset (deschidere pentru citire), Rewrite (deschidere pentru scriere), sau Append (deschidere pentru adăugare).

Mediul Turbo Pascal oferă o serie de funcții și proceduri predefinite pentru:

În această lucrare sunt prezentate câteve secvențe de program care ilustrează modul de utilizare a acestor funcții.


B. Exemple

În primul exemplu se dă codul (sursa) unui program care determină lungimea unui fișier și face o pozitțonare la jumatatea lui.

var
  f: file of Byte;
  size: longint;
  nume: string;

begin
  { Citeste numele fisierului }
  write('Numele fisierului: '); readln(nume);
  Assign(f, nume);
  Reset(f);
  size := FileSize(f);
  writeln('Dimensiunea fisierului in bytes: ', size);
  writeln('Pozitionare la jumatatea fisierului...');
  Seek(f, size div 2);
  writeln('Pozitia este ', FilePos(f));
  Close(f);
end.

Programul ar mai necesita verificarea existenței fișierului precizat. Funcția ExistaFisier, din următorul exemplu realizează tocmai acest lucru. Variabila predefinită IOResult va conține 0 dacă ultima operație de intrare/ieșire a decurs normal, altfel va conține un cod de eroare (semnificațiile posibilelor coduri de eroare nu fac subiectul acestei lucrări).

function ExistaFisier(nume: string): boolean;
{ Functie booleana care returneaza True daca fisierul exista;
  altfel returneaza False. Inchide fisierul daca aceasta exista }
var
  f: file;
begin
  {$I-} { inhiba mesajele de eroare pentru intrari/iesiri }
  Assign(f, nume);
  Reset(f);
  Close(f);
  {$I+} { reactiveaza mesajele de eroare la I/O }
  ExistaFisier := (IOResult = 0) and (Nume <> '');
end; { ExistaFisier)

C. Teme

  1. În practică este preferabil să nu se facă o sortare a fișierului de prelucrat, deoarece structura înregistrărilor ar putea să conțină mai multe chei de sortare:

    type
      inregistrare = record
        cheie1: TipCheie1;
        cheie2: TipCheie2;
        ......
        { Alte campuri }
      end;
    var f: file of inregistrare;

    iar la un moment dat să fie necesară o parcurgere a fișierului după prima cheie, apoi după a doua, sau chiar o parcurgere în forma originală a lui.

    De aceea, se preferă construirea unei liste care să conțină toate cheile după care se dorește sortarea la un moment dat, împreună cu poziția în fișier a fiecărei înregistrări.

    Se cere să se scrie un program care prelucrează un dicționar, memorat într-un fișier cu înregistrări de forma:

    type
      inregistrare = record
        cuvant: string[30];
        explicatii: string;
      end;

    Programul va crea fișierul cu cuvinte în ordinea apariției lor, împreună cu explicațiile necesare, după care va crea lista de cuvinte într-un tablou pe care îl va ordona și va afișa explicațiile aferente cuvântului introdus de la tastatură.
     

  2. Aceeași problema ca și la punctul 1, dar lista pentru căutarea cuvintelor se păstrează într-un fișier (numit fișier index), pentru a putea fi folosită ulterior.
     

  3. Se cere să se genereze un fișier care să conțină trei chei de căutare, generate aleator. Fișierul va avea 5000 de articole. După generarea fișierului, se vor crea fișierele index aferente, pe baza cărora se vor face căutarile.

  4. Să se scrie un program care să determine, în mod probabilistic, limba (română, engleză, etc.) în care este scris un document. Documentul va fi deschis și prelucrat ca fișier de caractere (file of char), iar numele documentului se dă de la tastatură. Programul va determina probabilitățile de apariție ale literelor din document și le va compara cu frecvențele statistice corespunzătoare diferitelor limbi. Pentru aceasta, se dă un al doilea fișier, cu numele "langfreq.dat", și având următorul tip de bază pentru componente:

    type
      tip_de_baza = record
        lang: string[15];	{numele limbii}
        freq: array ['A'..'Z'] of real
      end;

    Ca metrică pentru comparații se va folosi distanța Euclidiană : radical din suma pătratelor diferențelor. Programul va afișa "distanțele" față de fiecare limbă descrisă în fișierul "langfreq.dat" și în final va afișa numele limbii pentru care distanța este minimă.
    Click aici pentru fișierul langfreq.dat
    Click aici pentru document de test în limba română (cript.txt)
    Click aici pentru document de test în limba engleză (linux.txt)