Dátový typ súbor a práca so súbormi.

Príkazy vstupu a výstupu.

Ladiace údaje v súboroch.  


 

 


Textové súbory TEXT

Súbor = postupnosť (sekvencia) prvkov rovnakého typu, zvyčajne uložená na vonkajšom pamäťovom médiu.

Zaujímavé sú postupnosti znakov, t. j. textové súbory + špeciálne znaky <Eoln>.

Všetky údaje sú v textovom súbore zapísané ako ASCII znaky.

 

 

Súboru (file) musí byť priradené nejaké fyzické zariadenie, resp. musí sa nachádzať na nejakom zariadení:

"Operácie" so súbormi:

 

 

Ako pracujeme s textovým súborom

·         deklarovanie premennej typu textový súbor:
    var t:Text; { premenná t je typu textový súbor}

 

·         priradenie fyzického súboru najčastejšie na disku:
    Assign(t,'meno_súboru');

·         dávajte si pozor na uvádzanie plnej cesty na disku k nejakému súboru

·         otvorenie súboru

·         buď na čítanie (musí už existovať):
    Reset(t);

·         alebo zápis (ak už existuje, tak sa najprv vyprázdni):
    Rewrite(t);

 

·         práca so súborom, t.j. samotné čítanie alebo zapisovanie:
    read(t,...); readln(t,...);
    write(t,...); writeln(t,...);

 

·         zatvorenie súboru, t.j. ukončenie práce so súborom:
    Close(t);

 

·         textový súbor = postupnosť riadkov (aj prázdna)

 

 

Ak máme nejaký textový súbor:

vidíme:

v skutočnosti:

abC
 cde7
f

|a|b|C|<Eoln>| |c|d|e|7<Eoln>|f|
 ^
ukazovateľ

 

Čítanie zo súboru

 

Testovanie konca súboru a konca riadka

 

·         štandardná logická funkcia Eof(t) = skratka z End Of File

·         vráti true, ak je ukazovateľ nastavený za posledným znakom súboru

·         štandardná logická funkcia Eoln(t) = skratka z End Of LiNe

·         vráti true, ak je ukazovateľ na značke <Eoln> alebo aj za posledným znakom súboru, t.j. ak platí eof(t)=true, tak platí eoln(t)=true

·         príkazom readln(t) preskočíme všetky znaky v súbore až za najbližšiu značku <Eoln> (na konci súboru nerobí nič)

·         príkaz readln(t,z) je skrátený tvar pre read(t,z); readln(t);

·         čítanie na konci súboru vyvolá vstupno-výstupnú chybu

 

·         znak #26 má v pascale (z historických dôvodov) niekedy špeciálny význam: čítanie textového súboru si na ňom "myslí", že je na konci súboru (eof(t)=true) a nedovolí ho prečítať a ani čítať ďalšie znaky za ním...

·         môžete to otestovať tak, že si vytvoríte textový súbor, ktorý bude niekde v strede obsahovať znak #26, potom tento súbor vypíšte pomocou writeln(...) a tiež ho čítajte a vypisujte pomocou while not eof(t) do begin read(t,z); ...end;

V nasledujúcom príklade zistíme počet medzier v textovom súbore medzery.txt:

var
  t:Text;
  z:char;
  pocet:integer;
begin
  Assign(t,'medzery.txt'); Reset(t);
  pocet:=0;
  while not Eof(t) do begin
    read(t,z);
    if z=' ' then inc(pocet);
  end;
  Close(t);
  writeln('Počet medzier v súbore ', pocet);
       
end;

 

 

Príklad: Zistíme, dĺžku najdlhšieho riadka súboru text.txt

var
  t:Text;
  z:char;
  max,dlzka:integer;
begin
  Assign(t,'text.txt'); Reset(t);
  max:=0;
  while not Eof(t) do begin
    dlzka:=0;
    while not Eoln(t) do begin
      read(t,z); inc(dlzka);
    end;
    readln(t);   { nesmie sa tu zabudnúť}
    if dlzka>max then max:=dlzka;
  end;
  Close(t);
  writeln('Dĺžka najdlhšieho riadka ', max);  
end;

 

Zápis do súboru

 

iný variant kopírovania súboru - nevšímame si konce riadkov a prerábame malé písmená na veľké

var
  t1,t2:Text;
  z:char;
begin
  Assign(t1,'unit1.pas'); Reset(t1);
  Assign(t2,'text.txt'); Rewrite(t2);
  while not Eof(t1) do begin
    read(t1,z);
    if (z>='a') and (z<='z') then
      z:=char(ord(z)-ord('a')+ord('A'));            {alebo dec(z,32);}
    write(t2,z);
  end;
  Close(t1);
  Close(t2);
end;

 

Pozn:

 

 

Reset a Rewrite na ten istý súbor na disku

var f,g:Text;
...
Assign(f,'a.txt'); Reset(f);
Assign(g,'a.txt'); Rewrite(g);

 

 

Čítanie čísel

·         pomocou read môžeme čítať aj čísla (celé aj reálne), ale v súbore musia byť tieto čísla ukončené medzerou, koncom riadka alebo tabulátorom (znak s kódom #9)

·         príkaz read(t, číselná_premenná ) najprv preskočí všetky medzerové znaky (medzera, <Eoln> alebo #9), potom prekonvertuje znaky zo vstupu na číslo a ak je číslo ukončené nemedzerovým znakom (napr. ',' alebo ';'), tak vyhlási chybu Invalid numeric format

·         čítanie čísla na konci súboru (t.j. platí eof, ale aj ak sú tam len medzery) vráti hodnotu 0 - treba sa tohoto vyvarovať!

·         profesionálny softvér takýto read na čítanie čísel nepoužíva, lebo chyba v súbore spôsobí chybovú správu (výpočet je ďalej nekorektný) - vy môžete používať takéto čítanie, len ak je v zadaní výslovne povedané, že je súbor korektný a číslo je ukončené medzerovým znakom

·         neskôr uvidíme aj iný (bezpečný) spôsob čítania čísel

 

Príklad: Program nájde maximálne číslo v súbore celých čísel:

var
  t:Text;
  cislo,max:integer;
begin
  Assign(t,'text.txt'); Reset(t);
  max:=-maxint;       
  while not Eof(t) do begin     
    read(t,cislo);
    if cislo>max then max:=cislo;
  end;
  Close(t);
  if max=-maxint then
    writeln('súbor je prázdny')
  else
    writeln('maximálne číslo v súbore je ',max);
end;

 

·         ak súbor obsahoval napr. len prázdny riadok (alebo len medzery), tak program vypíše, že maximum bolo 0

·         toto isté sa stane, ak súbor obsahuje len záporné čísla a za posledným číslom sú ešte nejaké medzerové znaky - funkcia Eof(t) za posledným číslom vráti false - ešte nie je koniec súboru, ale už tam nie je žiadne číslo, teda načíta sa hodnota 0

 

Referencie:

A.   Blaho: Programovanie – prednáška, FMFI UK, Bratislava