V minulém díle jsme si vysvětlili, jak pracovat s textovými soubory. Doba jde ovšem dopředu a nám se víc budou hodit soubory typové a probereme si i soubory netypové.
Soubory v Pascalu jsou takřka nepostradatelné při větších programech, jak jsme si již vysvětlili minule. Ovšem řešit všechno přes textové soubory je neefektivní a také bezpečnost je velmi nízká. Proto si dnes vysvětlíme typové soubory.
Typové soubory
Typové soubory vnesly do programování novou šťávu, protože v sobě uchovávají informace o proměnných, a tudíž s nimi lze pracovat velmi flexibilně.
Všechny složky typových souborů mají stejnou délku a následují postupně za sebou. Tato vlastnost nám umožňuje volně se pohybovat po souboru, a to následujícími způsoby:
- Sekvenční přístup (postupný)
- Přímý přístup ke složkám podle jejich pořadového čísla, kde první složka souboru má pořadové číslo 0
- Kombinovaný přístup (kombinace obou předchozích metod)
Jednotlivé přístupy si vysvětlíme dále. Nyní se pustíme do samotného zavedení a práce se souborem.
Deklarace souboru:
Jak jsme již z Pascalu zvyklí, nejprve si musíme si všechno nadeklarovat v deklarační části a typový soubor není výjimkou. K deklaraci použijeme záznam (vysvětleno v lekci 9). Poté se soubor nadeklaruje jako soubor, jehož typ je záznam: soubor: File of lide;
Nejlepší bude uvést si příklad:
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:real;
end;
var soubor : File of lide;
Begin
end.
Takto jsme si tedy nadeklarovali soubor a jeho typ, který budeme používat. Znamená to, že soubor, se kterým budeme pracovat, je typový a bude pracovat jen s proměnnými ze záznamu lidé.
První kroky se souborem
Jak jsme si již vysvětlili v minulé lekci, první, co musíme udělat se souborem, je přiřazení jména souboru, tzn. název souboru na disku, na který se bude zapisovat. To učiníme příkazem Assign: Assign (název proměnné souboru,'název souboru');. V našem případě takto:
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:real;
end;
var soubor : File of lide;
Begin
clrscr;
Assign(soubor,'Lide.dat');
end.
U typových souborů neplatí žádné pravidlo pro příponu souboru. Můžete si sami zvolit, jaký typ souboru chcete použít. V našem příkladu budeme používat soubor Lide.dat
Máme tedy přiřazené jméno a jediné, co nám zbývá, abychom mohli se souborem pracovat, je soubor otevřít.
Otevření souboru
Máme dvě metody otevření souboru a každá má jinou funkci, tak se na ně podíváme:
- Rewrite
- Pokud soubor na disku neexistuje, je vytvořen a připraven na zápis. Pokud soubor již existuje, přepíše se celý novými daty. Syntaxe: Rewrite(proměnná souboru)
- Reset
- Otevření existujícího souboru na disku. Pokud soubor neexistuje, program zahlásí chybu. Syntaxe: Reset(proměnná souboru)
Oba typy otevření souboru umožňují číst i zapisovat ze souboru.
V minulé lekci jsme se naučili jak ošetřit neexistující soubor na disku a to samé použijeme i zde:
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:real;
end;
var soubor : File of lide;
Begin
clrscr;
Assign(soubor,'Lide.dat');
{$I-} (* Vypnutí vnitřní kontroly chyb *)
Reset(soubor); (* Zkouška otevření souboru *)
if IOResult<>0 then Rewrite(soubor); (* Ověření dostupnosti souboru *)
{$I+} (* Znovuzapnutí vnitřní kotroly chyb *)
end.
Nyní jsme otevřeli soubor. Pokud soubor na disku neexistuje, založili jsme nový.
Úplně posledním krokem v práci se souborem je samozřejmě zavření souboru. Pamatujte si, že je nezbytné vždy soubor uzavřít. Uzavření provedeme opět příkazem Close(proměnná souboru);.
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:real;
end;
var soubor : File of lide;
Begin
clrscr;
Assign(soubor,'Lide.dat');
{$I-}
Reset(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
Close(soubor);
end.
Vše nezbytné pro samotnou práci se soubory jsme si tedy vysvětlili a můžeme se pustit do samého těla práce.
Práce se soubory
Operace, které můžeme provádět se soubory, jsou vstupní, výstupní a ostatní operace.
Výstupní operace
Výstupní operace znamená zapisovat do souboru, pohybovat se v souboru a další funkce pro práci se soubory:
- Write
- Zapisování hodnot (proměnných) do souboru. Syntaxe: Write(soubor,promenna);
- Seek
- Přesunutí v souboru na určitou složku souboru. Syntaxe: Seek(soubor,pořadí složky);
- Eof
- Zjištění konce souboru. Pokud se nacházíte na konci souboru, vrací hodnotu TRUE. Syntaxe: Eof(soubor);
- FilePos
- Vrací hodnotu (číslo) složky, ve které se právě nacházíte. Syntaxe: FilePos(soubor);
- FileSize
- Vrací hodnotu (počet) všech složek v souboru. Syntaxe: FileSize(soubor);
- Truncate
- Smazání všech složek od aktuální až do konce souboru. Syntaxe: Truncate(soubor);
Toto jsou základní výstupní operace se soubory. My je použijeme v našem případě a zapíšeme si jednu složku do souboru. Nejdříve si přidáme do deklarační části proměnnou, která má typ jako soubor.
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:integer;
end;
var soubor : File of lide;
clovek : lide;
Begin
clrscr;
Assign(soubor,'Lide.dat');
{$I-}
Reset(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
clovek.jmeno:='Tomas';
clovek.vek:=17;
clovek.vyska:=183;
Write(soubor,clovek);
Close(soubor);
end.
Zapsali jsme si hodnotu do souboru. Nyní ji můžeme ze souboru přečíst.
Vstupní operace
Vstupní operace je pouze jedna a je to čtení ze souboru.
- Read
- Vyčte ze souboru složku, kterou rozdělí do proměnných podle záznamu. Syntaxe: Read(soubor,promenna);
Zkusíme si námi vložené údaje opět vyčíst.
Program typsoubor;
uses crt;
Type lide = Record
jmeno:string;
vek:integer;
vyska:integer;
end;
var soubor : File of lide;
clovek : lide;
Begin
clrscr;
Assign(soubor,'Lide.dat');
{$I-}
Reset(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
clovek.jmeno:='Tomas';
clovek.vek:=17;
clovek.vyska:=183;
Write(soubor,clovek);
Close(soubor);
Reset(soubor);
Read(soubor,clovek);
Close(soubor);
end.
Vyčetli jsme ze souboru naše údaje. Jistě jste si všimli, že před čtením jsme museli soubor uzavřit. Na to nikdy nezapomeňte, protože jinak se vám do souboru neuloží změny.
Poslední dvě oprace, o kterých si povíme s typovými soubory:
- Erase
- Smazání souboru z disku. Syntaxe: Erase(soubor);
- Přejmenování souboru. Syntaxe: Rename(soubor,'nové jméno');
Naučili jsme se tedy veškerou práci s typovými soubory a můžeme se jen v rychlosti podívat na netypové.
Netypové soubory
Netypové soubory se používají hlavně tehdy, když dopředu nevíme, jaký typ souboru použijeme nebo máme k dispozici. Netypové soubory se hlavně používají pro přístup ke všem typům souborů na disku.
Netypovým souborům nechci ve svém kurzu přikládat zvláštní pozornost. Já sám jsem je nikdy nepoužil. S netypovými soubory se pracuje skoro stejně jako s typovými soubory s rozdílem dvou příkazů:
- BlockWrite
- Přečte z netypového souboru určitý sektor dat. Syntaxe: BlockWrite(soubor,promenna,počet,celkem);
- BlockRead
- Chová se stejně jako BlockWrite, ale místo zapisování čte ze souboru. Syntaxe: BlockRead(soubor,proměnná,počet,celkem);
Ostatní funkce jsou stejné nebo velice podobné jako u typových souborů, ale s netypovými soubory se v mém kurzu nesetkáte. Pokud by byl opravdu velký zájem, mohl bych napsat něco jako lekci navíc o těchto souborech.
Jsme tedy u konce dnešní lekce se soubory. Čeká nás už jen domácí úkol.
Domácí úkol
Použijte svůj domácí úkol z 9. lekce se záznamy. Záznam zapište do soubru (všech 6) a pak je všechny opět vypište. Aby někdo nepodváděl, tak na zapsání a vypsání záznamů si zvolte dvě proměnné.