Dátový typ súbor a práca so súbormi.
Príkazy vstupu a výstupu.
Ladiace
údaje v súboroch.
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:
·
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 |
|a|b|C|<Eoln>|
|c|d|e|7<Eoln>|f| |
·
š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; |
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; |
var f,g:Text;
...
Assign(f,'a.txt'); Reset(f);
Assign(g,'a.txt'); Rewrite(g);
·
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: