Zpět na seznam článků     Číst komentáře (4)     Verze pro tisk

Pascal pro začátečníky 9 - Práce se soubory

Autor: Kub@z   
13.4.2004

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...


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):

FunkceVý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

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.72/61

1  2  3  4  5    
(známkování jako ve škole)