Textové súbory TEXT
Súbor = postupnosť (sekvencia) prvkov rovnakého typu, 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.
- pascal umožňuje sekvenčný prístup do súboru ale aj priamy (uvidíme
neskôr)
- s textovými súbormi sa dá pracovať len sekvenčným prístupom
- musí sa rozlišovať, či zo súboru čítame alebo do neho zapisujeme údaje:
- vstupný súbor - len čítať pripravené údaje
- výstupný súbor - len zapisovať, na koniec súboru!
- do textového súboru sa nedá aj zapisovať aj súčasne z neho čítať
Súboru (file) musí byť priradené nejaké fyzické zariadenie, resp. musí
sa nachádzať na nejakom zariadení:
- na vonkajšej pamäti - diskový súbor
- pomocná vnútorná pamäť - naučíme sa neskôr
"Operácie" so súbormi:
- write = zápis informácie na koniec súboru (podobne ako do
textovej ploche pomocou Memo1.Lines.Add(...))
- read = čítanie nasledujúcej hodnoty zo súboru
Ako pracujeme s textovým súborom
- deklarovanie premennej typu textový súbor:
var t:TextFile; //
premenná t je typu textový súbor
- priradenie fyzického súboru najčastejšie na disku:
AssignFile(t,'meno_súboru');
- dávajte si pozor na uvádzanie plnej cesty na disku k nejakému súboru
- ak sa takýto program prenesie na iný počítač, s veľkou
pravdepodobnosťou tieto absolútne cesty k súborom nebudú fungovať -
používajte radšej relatívne cesty od momentálnej adresy projektu
(tam, kde sa nachádza EXE súbor)
- 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:
CloseFile(t);
- textový súbor = postupnosť riadkov (aj prázdna)
- pričom riadok textového súboru = postupnosť znakov (aj prázdna) ukončená
<Eoln>
- ukazovateľ = pozícia v súbore - na začiatku je na 1. znaku; po read
sa posunie o 1 znak vpravo
Čítanie zo súboru
- príkazom read(t, premenná ) sa prečíta jeden znak zo súboru
z pozície ukazovateľa, priradí sa jeho hodnota do premennej
a ukazovateľ sa posunie
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
- značka <Eoln> sa vnútorne kóduje dvomi znakmi #13 a #10
(hovoríme im CR a LF)
- 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č)
- POZOR, pomocou read(t,z) je možné čítať aj značku
<Eoln>, lenže táto sa potom chápe ako 2 znaky #13 a #10 a nie
ako nejaký špeciálny znak
- 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 Memo1.Lines.LoadFromFile(...) a tiež ho čítajte a vypisujte
pomocou while not eof(t) do begin read(t,z); ...end;
Úloha 1: Napíšte program, ktorý vypíše počet riadkov v subore.
procedure TForm1.Button2Click(Sender: TObject);
var t:textfile;
pocet:integer;
begin
AssignFile(t,'vstup.txt');
Reset(t);
pocet:=0;
while not Eof(t) do begin
readln(t);
inc(pocet);
end;
CloseFile(t);
Memo1.Lines.Add('Pocet riadkov v subore: '+inttostr(pocet));
end;
Zápis do súboru
- súbor treba otvoriť pomocou Rewrite(t)
- ak súbor už existoval, tak hneď po Rewrite sa zruší
jeho obsah
- ak súbor ešte neexistoval, vytvorí sa s prázdnym obsahom
- ukazovateľ v súbore je vždy nastavený na jeho koniec
- príkaz write(t, znak ) zapíše do súboru jeden znak; write(t,
reťazec ) zapíše kompletný reťazec
- príkaz writeln(t) zapíše do súboru značku <Eoln>, t.j.
robí to isté ako write(t,#13#10)
- príkaz writeln(t, reťazec ) je skrátený tvar pre write(t,
reťazec ); writeln(t); alebo aj write(t, reťazec
,#13#10);
- v nasledujúcom príklade využijeme
Memo1.Lines.LoadFromFile(meno_súboru)
pomocou ktorého zapíšeme obsah celého súboru do textovej plochy
Úloha 2: Napíšte program, ktorý
do súboru zapíše postupnosť znakov a b c d .... z
b c d ......z
c d ......z
........
z
procedure TForm1.Button5Click(Sender: TObject);
var t:textfile;
z,znak:char;
begin
Assignfile(t,'skuska.txt');
Rewrite(t);
for z:='a' to 'z' do begin
for znak:=z to 'z' do write(t,znak);
writeln(t);
end;
CloseFile(t);
Memo1.Lines.LoadFromFile('skuska.txt');
end;
Reset a Rewrite na ten istý súbor na disku
- nepredvídateľné - rôzne verzie Pascalu reagujú rôzne (Delphi hlási
I/O chybu)
návrat