Pro práci se soubory slouží v Pascalu datový typ "
file" a pokud chceme pracovat s textovým souborem, využijeme typ "
text". Je sice trochu zvláštní, že se souborem pracujeme jako s proměnnou, ale je to jednodušší. Nejdříve je nutné si deklarovat proměnnou typu file. Ale pozor! File je taky určitého typu (jako pole) a (stejně jako u pole) se tento typ definuje slovíčkem "
of":
var f: file of byte;
Soubor může být jakéhokoliv typu (vyjma typu file - "var f: file of file" je blbost), tzn. i vlastního typu, který si nadefinujeme pomocí příkazu "type", což se hodí zejména pro uložení nějakých dat s více položkami. Pro práci se soubory slouží tyto procedury (funkce):
Funkce | Význam |
assign(f: file, jmeno) | Přiřadí proměnné typu file jméno souboru |
reset(f: file) | Otevře soubor |
rewrite(f: file) | Vytvoří nový soubor (nebo přepíše starý se stejným jménem) |
append(f: text) | Otevře textový soubor a nastaví pozici na konec souboru |
close(f: file) | Ukončí práci se souborem |
Filesize(f: file) | Vrátí počet dat stejného typu jako soubor |
seek(f: file, pozice) | Přejde na pozici v souboru |
filepos(f: file) | Vrátí pozici v souboru |
rename(f: file, jmeno) | Přejmenuje soubor na zadané jméno |
erase(f: file) | Smaže soubor |
eof(f: text): boolean | Logická hodnota - je pozice na konci souboru? |
eoln(f: text): boolean | Logická hodnota - je pozice na konci řádku? |
readln(f: text, prom) | Načte řádek do textové proměnné |
read(f: file, prom) | Načte hodnotu do proměnné stejného typu jako soubor |
writeln(f: text, text) | Zapíše text do textového souboru |
write(f: file, prom) | Zapíše hodnotu stejného typu jako soubor |
Nelekejte se, není to nic těžkého. Pro začátek si ukážeme, jak pracovat s textovými soubory:
var f: text;
pom: string;
begin
assign(f, 'muj.txt'); (* přiřadíme jméno *)
reset(f); (* otevřeme soubor *)
while not eof(f) do begin (* dokud nedojdeme na poslední řádek *)
readln(f, pom); (* načteme řádek do proměnné *)
writeln(pom); (* vypíšeme řádek na obrazovku *)
end;
close(f); (* ukončíme práci se souborem *)
end.
Jak vidíte, je zde použita funkce "readln", kterou už jsme používali pro vstup z klávesnice. Pokud je v této funkci uveden jako první parametr soubor, načte se text ze souboru. Stejně tak je to i s funkcemi "read", "write" a "writeln". Nyní si ukážeme, jak do textového souboru zapisovat:
var f: text;
pom: string;
begin
assign(f, 'muj.txt'); (* přiřadíme jméno *)
rewrite(f); (* vytvoříme soubor - nemusíme ho otvírat pomocí *)
(* reset, protože funkce rewrite ho rovnou i otevře *)
repeat
readln(pom); (* uživatel zadá text *)
writeln(f, pom); (* zapíšeme text do souboru *)
until pom = ''; (* dokud nebude zadáno nic *)
close(f); (* ukončíme práci se souborem *)
end.
Dalo by se říct, že jste právě vytvořil svůj první textový editor :).
Jen ještě jedna poznámka - ke každému příkazu "reset" je vhodné umístit i vlastní ošetření chyb. Jednoduše uděláte:
{$I-}
reset(f);
{$I+}
if ioresult <> 0 then begin
writeln('Soubor se nepodarilo otevrit');
halt;
end;
Příkaz "halt" ukončí běh programu. To je zde nutné z toho důvodu, že kdyby se soubor otevřít nepodařilo, proběhly by nějaké příkazy třeba pro čtení dat ze souboru a to by také způsobilo chybu.
S binárními (prostě jinými než textovými) soubory se pracuje trochu jinak. U každého souboru existuje jakási virtuální pozice, která určuje kde se právě v souboru nacházíte. Neurčuje však byte, ale pozici v souboru závislou na datovém typu. Příklad:
type zaznam = record (* vytvoříme si vlastní typ záznamu *)
jmeno, prijm: string[20];
vek: byte;
end;
var f: file of zaznam; (* soubor *)
pom: zaznam; (* pomocná proměnná stejného typu jako soubor *)
pos: integer; (* pozice v souboru *)
begin
assign(f, 'data.dat'); (* přiřadíme jméno *)
rewrite(f); (* vytvoříme nový soubor *)
pos := 0; (* pozici nastavíme na 0 *)
repeat (* cyklus se opakuje do nekonečna *)
writeln('Jmeno: '); readln(pom.jmeno); (* uživatel zadá data *)
if pom.jmeno = '' then break; (* pokud je jméno prázdné, cyklus se ukončí *)
writeln('Prijmeni: '); readln(pom.prijm);
writeln('Vek: '); readln(pom.vek);
seek(f,pos); (* přejdeme na zadanou pozici v souboru *)
write(f,pom); (* zapíšeme data do souboru *)
pos := pos + 1; (* pozici zvedneme o 1 *)
until false; (* opakování cyklu *)
close(f); (* ukončíme práci se souborem *)
end.
Tak co je tady nového? Přibyla nám procedura "seek", která posune pozici v souboru na zadanou hodnotu. My chceme, aby se další záznamy pořád přidávaly, a proto hodnotu proměnné "pos" zvýšíme pokaždé o 1. Procedura "write" zapíše data na zadanou pozici v souboru. Na konci práce soubor zavřeme procedurou "close", což je velice důležité, jinak se zadaná data neuloží!!!
Teď bychom měli udělat nějaký prohlížeč pro tu naši "databázi":
type zaznam = record (* vytvoříme si vlastní typ záznamu *)
jmeno, prijm: string[20];
vek: byte;
end;
var f: file of zaznam; (* soubor *)
pom: zaznam; (* pomocná proměnná stejného typu jako soubor *)
pos: integer; (* pozice v souboru *)
begin
assign(f, 'data.dat'); (* přiřadíme jméno *)
reset(f); (* otevřeme náš soubor *)
pos := 0; (* pozici nastavíme na 0 *)
while pos < filesize(f) do begin (* dokud nejsme na konci souboru *)
seek(f,pos);
read(f,pom); (* načteme data *)
writeln('Jmeno: '+pom.jmeno+', Prijmeni: '+pom.prijm+', Vek: ',pom.vek);
(* vypíšeme *)
pos := pos + 1;
end;
close(f); (* ukončíme práci se souborem *)
end.
Funkce "
read" načte data z pozice do proměnné.
Teď už máme systém databáze, jen by měla být trochu víc "user friendly", ale to už nechám na vás. Následující lekce se už věnuje unitě CRT, která slouží pro základní komunikaci s hardwarem a softwarem a díky níž už budete mít nástroj např. pro naprogramování procedury na vykreslení rámečku apod.
Kub@z