Textové súbory TEXT a číslo
Čí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
- 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
- v takejto situácii môžeme namiesto Eof(t) použiť štandardnú
funkciu SeekEof(t), ktorá skôr ako odpovie na stav súboru,
odfiltruje všetky medzerové znaky
- podobne existuje SeekEoln(t), ktorá testuje koniec riadka, ale
najprv odfiltruje medzery a tabulátory (znaky s kódom #9)
- Pozn. Pri použití funkcie SeekEoln(t) a SeekEof(t) sa
odignorujú všetky medzery, tabulátory a v prípade SeekEof(t) i
konce riadkov. Preto tieto funkcie nie sú veľmi vhodné pri čítaní
znakov, používame ich hlavne pri čítaní čísel z textového súboru.
Zápis čísel
- pomocou write(t, ...) môžeme do textového súboru zapisovať aj
čísla (hodnoty číselných výrazov)
- celé čísla sa zapíšu bez medzery pred číslom aj za číslom, t.j.
write(t,i,i+1) pre i=17 zapíše 1718
- reálne čísla sa do súboru zapisujú v semilogaritmickom tvare s
medzerou pred číslom
Formátovací parameter vo write
- za znakom alebo znakovým reťazcom
write(t,'*':10);
označuje, že znak sa vypíše na šírku 10, t.j. najprv 9 medzier a potom
'*'
write(t,'delphi':3);
nakoľko reťazec je dlhší ako formátovací parameter, zapíše sa
kompletný reťazec, t.j. ignoruje sa formát
- formátovací parameter za celým číslom označuje šírku, do
ktorej sa má zapísať číslo, ak by nevošlo do danej šírky, formát sa
ignoruje
write(t,25*25:5);
zapíše dve medzery, za ktoré dá číslo 625
- formátovací parameter za reálnym číslom tiež označuje šírku,
číslo sa vypíše v semilogaritmickom tvare; druhý formátovací
parameter označuje počet desatinných miest
write(t,sin(2):15);
zapíše 9.092974E-0001
write(t,cos(2):7:4);
zapíše -0.4161
Úloha: Napíšte program, ktorý
nájde maximum z celých čísel v súbore.
var t:textfile;
cislo,max:integer;
prazdny:boolean;
begin
Assignfile(t,'cislo.txt');
Reset(t);
prazdny:=true;
if not Seekeof(t) then begin
read(t,max);
prazdny:=false;
end;
while not Seekeof(t) do begin
read(t,cislo);
if cislo>max then max:=cislo;
end;
closefile(t);
if not prazdny then Memo1.Lines.Add('Maximum z cisel v subore: '+inttostr(max))
else Memo1.Lines.Add('Subor je prazdny.');
end;
návrat