Nejdřív si povíme, jaké Pascal rozlišuje soubory.
Jsou to tyto tři typy:
- Textové soubory - Text se ukládá ve ,,srozumitelné" podobě člověku a výsledný soubor má stejnou podobu jako normální textový soubor vytvořený v poznámkovém bloku.
- Typové soubory - Typový soubor nepřečtete bez znalosti použitých proměnných v programu. Do souboru se ukládají veškeré informace o proměnných, proto soubor není ukládaný srozumitelně člověku.
- Netypové soubory - Asi nejméně používaný formát, do kterého se může uložit cokoliv jakéhokoliv datového typu.
Je nutno dodržovat základní postup práce se soubory:
- Přiřazení jména souboru
- Otevření souboru
- Práce se souborem
- Uzavření souboru
Měli byste dodržovat pravidlo, že při práci se souborem nebudete otevírat více než dva soubory. Pokud budete pracovat se soubory ihned po ukončení operací, soubor uzavřete! Při otevírání každé počáteční operace se souborem použijte funkci pro ověření přístupnosti souboru.
Dva základní příkazy, jak si jistě domyslíte, jsou pro všechny stejné: pro přiřazení jména souboru a uzavření souboru. Pro přiřazení jména souboru se používá příkaz Assign(nazev_promenne,'Cesta k souboru'); a pro uzavření souboru Close(prirazene_jmeno_souboru);
Textové soubory
Krok po kroku si nyní ukážeme, jak pracovat s textovým souborem. Naprogramujeme si například hru a chceme uložit výsledné skóre do tabulky. Uložení skóre by bylo naprogramováno ve hře jako podprogram, ale já ho jako příklad napíšu jako samostatný program.
Prvním krokem je deklarace proměnné, která nám bude simulovat soubor. Deklaraci provádíme za slůvkem var takhle:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
End.
Druhý bod pustupu bude přiřazení jména souboru. Jak jsem výše napsal, provádí se příkazem Assign:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
End.
Přiřazením jména souboru ho neotevíráte ani neprovádíte jinou operaci. Dokonce ani není nutné, aby tento soubor existoval. Prostě jen do proměnné přiřadíte cestu. Pokud máte soubor ve stejném adresáři jako program samotný, stačí napsat do uvozovek pouze jeho název: Assign(soubor,'Skore.txt'); . Platí také, že přípona souboru nemusí být nutně txt, ale příponu si můžete zvolit jakoukoli chcete.
Dalším krokem pro práci s textovým souborem je jeho otevření. Zde už je to složitější, protože musíte vědět. co chcete se souborem udělat. Metody otevření jsou:
- Rewrite - Pokud soubor na disku existuje, potom se otevře a přepíše se novými daty.
- Append - Otevření souboru na pozici posledního řádku pro zápis (přidávání do souboru).
- Reset - Otevření souboru POUZE pro čtení.
Pro naše účely bude jasně nejlepší volba Append. Do souboru budeme připisovat stále nové skóre. Otevřeme si tedy soubor:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
Append(soubor);
End.
Nyní máme otevřený soubor na jeho konci připravený pro zápis. Na začátku jsem zmínil, že musíme při otevírání souboru a dalších operací zkontrolovat, zda je soubor dostupný. Proto přidáme pár řádků k našemu programu:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
{$I-} (* Vypnutí vnitřní kontroly chyb *)
Append(soubor);
if IOResult<>0 then Rewrite(soubor); (* Ověření dostupnosti souboru *)
{$I+} (* Znovu zapnutí vnitřní kotroly chyb *)
End.
Máme otevřený soubor i s ověrením a můžeme se pustit do zapsání skóre.
Pro zapisování do souboru se používá ten samý příkaz jako pro výpis na obrazovku jen v trošku pozměněném tvaru: Writeln(nazev_souboru,co_chceme zapsat);
Můžeme zapisovat samozřejmě jak příkazem Write, tak příkazem Writeln. Rozdíl je stejný jako ve výstupu na obrazovku. Toto se rozlišuje až u typových souborů. Nyní si tedy proměnnou body zapíšeme do souboru. Soubor máme otevřený pro zápis na poslední pozici, tzn. pro přidávání do souboru, a proměnnou zapíšeme příkazem Writeln, aby byl soubor přizpůsoben pozdějšímu čtení:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
{$I-}
Append(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
Writeln(soubor,body);
End.
Máme tedy zapsána data a chtěli bychom je dostat zpět. Čtení se, stejně jako zapisování, provádí standardním, trochu pozměněným příkazem Read (nazev_soboru,promenna_do_ktere_cteme); . Musíme mít ovšem na paměti, že máme soubor otevřen pro zadávání na konec, proto musíme soubor uzavřít a otevřít ho pro čtení:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
{$I-}
Append(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
Writeln(soubor,body);
Close(soubor);
Reset(soubor);
End.
U otevření pro čtení bychom opět měli zapsat kontrolu dostupnosti souboru, ale v tomto případě tam není potřebná. Kontrola je potřebná jen tehdy, když to dá logiku. To už nechám na vás. Přečteme si tedy informace ze souboru a vypíšeme je na obrazovku:
Program skore;
uses crt;
var i,body,vypis:integer;
soubor:Text;
Begin
Assign(soubor,'C:\Hra\Skore.txt');
{$I-}
Append(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
Writeln(soubor,body);
Close(soubor);
Reset(soubor);
Repeat
Readln(soubor,vypis);
Writeln(vypis);
until eof(soubor);
close(soubor);
readkey;
End.
Jistě jste si všimli, že v podmínce cyklu jsem použil zvláštní, vám dosud neznámý, příkaz. Pojďme si tedy několik těchto příkazů vysvětlit.
- Eoln(nazev_souboru) - End of Line. Zjistí, jestli se nacházíte na konci řádku a vrací hodnotu True nebo False.
- Eof(nazev_souboru) - End of File. Zjistí, jestli se nacházíte na konci souboru.
- Erase(nazev_souboru) - Smazání souboru z disku.
- Rename(nazev_souboru,novy_nazev) - Přejmenování souboru
Takto si lze snadno obstarat obsluhu textových souborů se vším všudy. Dnes jsme toho probrali dost, typové a netypové soubory si necháme na příště.
Domácí úkol
Zadání dnešního úkolu bude jednoduché, ale výsledkem vaší práce bude takřka profesionální program. Udělejte mi jednoduchou hru, která bude obsahovat menu se třemi prvky. Nová hra, Tabulka skóre, Konec. Přes toto úvodní menu už pokračování nechám na vás. Pod novou hrou naprogramujete pomocí příkazů, které již znáte, nějakou jednoduchou hru, která po dohrání vyzve k vložení přezdívky a uloží přezdívku a skóre do souboru. Pod tabulkou skóre bude pouze výpis ze souboru a nějaký ten design (například Nick.......skóre). Jelikož menu musíte řešit příkazem CASE, tak pod položkou konec bude jediný přikaz: Exit;