Stránky neboli dlhú dobu aktualizované. Môžu obsahovať nepresné alebo neaktuálne informácie.
Hľadanie
Rozšírené vyhľadávanie
TOP 7 - stránky
Napaľovacie programy - 108 189x
Free Pascal - Úvod - 65 873x
Lazarus - Kreslenie - 47 454x
Free Pascal - Začiatky - 44 737x
Free Pascal - Podmienky - 37 095x
Free Pascal - Cykly - 36 345x
Internetové prehliadače - 36 211x
Nové v diskusii
Free Pascal - Cykly - štvrtok 31.3.
Lazarus - Začíname - piatok 25.3.
Anketa - streda 2.3.
Navigácia: Programovanie > Free Pascal - Práca so súbormi

Free Pascal - Práca so súbormi

Prístup k súborom na disku je dôležitý takmer pre každú bežnú aplikáciu. Ukážme si, ako sa s nimi pracuje v Pascale.

Súbory všeobecne

Najprv je potrebné vytvoriť premennú, ktorá bude daný súbor symbolizovať. Táto premenná môže byť typu file - tzv. netypovaný súbor, file of nejaký_typ - súbor s určeným typom, text - textový súbor.

var
 Subor: Text;

Teraz je treba premennú „zviazať“ s konkrétnym súborom na disku. Slúži na to procedúra Assign (v Delphi-móde AssignFile).

Assign(Subor, 'C:\MOJE.TXT');

Premenná subor bude odteraz odkazovať na súbor C:\MOJE.TXT. Ak nemáte prístup do priečnika C:\, radšej zapisujte do aktuálneho adresára - je to priečinok, v ktorom sa práve nachádzate a z ktorého bol program spustený. Stačí úplne vynechať cestu k súboru:

Assign(Subor, 'MOJE.TXT');

Keď je už názov súboru určený, je na čase otvoriť ho. V Pascale existujú tri možnosti jeho otvorenia - na čítanie, zapisovanie a pripisovanie. Tretí spomínaný je dostupný len pre textové súbory. Spôsob práce uvediem pre každý typ súboru zvlášť.

Textové súbory

Začneme s textovými súbormi, keďže sú asi najjednoduchšie na pochopenie. Ich využitie nájdeme napr. pri tvorbe textového editora, ukladaní jednoduchých hodnôt do konfiguračného súboru a pod.

Textový súbor otvoríme jednou z procedúr:

  • Reset - ak z neho potrebujeme čítať. Súbor už musí na disku existovať.
  • Rewrite - kvôli zapisovaniu. Ak súbor nejestvuje, vytvorí sa. Pokiaľ však existuje, prepíše sa a stratíme jeho pôvodný obsah!
  • Append - pre pripisovanie na koniec súboru. Ten už musí existovať.

Parametrom týchto procedúr je vždy premenná symbolizujúca súbor (typ text).

Rewrite(Subor);

Po otvorení môžeme do súboru zapisovať, čítať z neho a pod. Procedúra ReadLn(subor, riadok) prečíta riadok zo súboru subor a zapíše ho do premennej riadok. Posunie sa ukazovateľ (predstavme si ho ako kurzor), takže pri ďalšom volaní tejto procedúry sa číta vždy ďalší a ďalši riadok.

WriteLn(subor, riadok) zapíše do súboru hodnotu druhého parametra a vytvorí nový riadok.

Obdobne fungujú procedúry Read a Write.

Tu je jednoduchý príklad. Úlohou je vypísať obsah textového súboru na obrazovku. Použijeme pri tom funkciu Eof(súbor), ktorá vráti true, ak bol dosiahnutý koniec súboru. Close(súbor) zatvorí súbor.

program subory;
var
 Subor: Text;
 riadok: string;
begin
 {priradime premennej konkretny subor}
 Assign(subor, 'C:\MOJE.TXT');
 {otvorime ho na citanie}
 Reset(subor);
 {kym nie je koniec suboru}
 while not Eof(subor) do begin
  {precitame riadok zo suboru}
  ReadLn(subor, riadok);
  {zapiseme riadok na obrazovku}
  WriteLn(riadok);
 end;
 {zatvorime subor}
 Close(subor);
end.

Netypované súbory

Používajú sa najmä pri operáciách, kde nás nezaujíma, čo konkrétne je v súbore uložené - napríklad na kopírovanie súborov.

Na otvorenie používame tieto procedúry:

  • Reset - otvorí súbor (už existujúci) na čítanie aj zápis.
  • Rewrite - otvorenie na čítanie a zápis. Neexistujúci súbor sa vytvorí, jestvujúci sa prepíše.

Spomínané procedúry majú dva parametre. Prvý symbolizuje daný súbor (typ file) a druhý, celočíselný, udáva veľkosť bloku dát.

Miesto procedúr Read a Write tu používame BlockRead a BlockWrite. Tie majú 3 povinné parametre - súbor, buffer (ľubovoľná pomocná premenná), počet bytov zabraných bufferom. Ten zistíme funkciou SizeOf(premenná). Do štvrtého (nepovinného) parametra sa uloží počet prečítaných / zapísaných záznamov.

Je tu dosť veľa teórie, ale iste viac pochopíte z príkladu - už spomínané kopírovanie súborov:

program kopiruj;
var
 zdroj, ciel: File;
 {buffer bude pole 512 znakov}
 buffer: array[1..512] of char;
 precitane: integer;
begin
 {zdrojovy subor otvorime na citanie}
 Assign(zdroj, 'C:\ZDROJ.BIN');
 Reset(zdroj, 1);
 {cielovy na pisanie}
 Assign(ciel, 'C:\CIEL.BIN');
 Rewrite(ciel, 1);
 {postupne citame z 1. a zapisujeme do 2. suboru}
 repeat
  {zo zdroja precitame max. 512 bytov, ulozime
  ich do buffera, premenna PRECITANE bude
  obsahovat pocet skutocne precitanych bytov}
  BlockRead(zdroj, buffer,
   SizeOf(buffer), precitane);
  {buffer zapiseme do ciela}
  {velkost buffera v bytoch = PRECITANE}
  BlockWrite(ciel, buffer, precitane);
 until precitane = 0;
 Close(zdroj);
 Close(ciel);
end.

Dalo by sa to aj jednoduchšie, ale tento spôsob by mal byť pomerne rýchly.

Súbory s určeným typom

Môžeme ich použiť, ak potrebujeme v binárnej forme ukladať viacero záznamov s rovnakou štruktúrou - napr. rodné čísla, adresy a pod. Deklarácia je nasledujúca:

var
 subor: file of typ_premennej;

Na otváranie sú určené procedúry Reset a Rewrite (ako pri netypovaných súboroch). Čítanie a zápis je možný vďaka procedúram Read a Write.

Príklad: Prvý program zapíše do súboru čísla zadané z klávesnice. Po zadaní a zapísaní nuly sa program ukončí.

program citaj;
var
 cislo: integer;
 subor: File of integer;
begin
 {otvorime a prepiseme subor}
 Assign(subor, 'C:\CISLA.BIN');
 Rewrite(subor);
 repeat
  {precitame cislo z klavesnice}
  ReadLn(cislo);
  {zapiseme ho do suboru}
  Write(subor, cislo);
 {zadanim nuly sa program ukonci}
 until cislo = 0;
 Close(subor);
end.

Druhý ich zas z tohto súboru prečíta a vypíše na obrazovku.

program pis;
var
 cislo: integer;
 subor: File of integer;
begin
 {otvorime subor}
 Assign(subor, 'C:\CISLA.BIN');
 Reset(subor);
 {kym nie je koniec suboru}
 while not Eof(subor) do begin
  {precitame cislo zo suboru}
  Read(subor, cislo);
  {vypiseme cislo na obrazovku}
  WriteLn(cislo);
 end;
 Close(subor);
end.

Test existencie súboru

Ak potrebujeme zistiť, či daný súbor už existuje, vo FreePascale použijeme funkciu FileExists(názov_súboru) z jednotky SysUtils.

V TurboPascale je situácia zložitejšia. Musíme vypnúť kontrolu vstupno-výstupných chýb direktívou prekladača {$I-}. Potom sa pokúsime otvoriť súbor na čítanie. Ak sa hodnota funkcie IOResult (chybový kód poslednej vstupno-výstupnej operácie) rovná nule, súbor existuje - nebola zaznamenaná žiadna chyba.

program exist;
var
 subor: file;
begin
 Assign(subor, 'C:\SKUSKA.BIN');
 {vypneme kontolu chyb}
 {$I-}
 {pokusime sa otvorit subor}
 Reset(subor);
 {podla hodnoty chyboveho kodu
 vypiseme, ci subor existuje}
 if IOResult = 0 then
  writeln('Subor existuje.')
 else
  writeln('Subor neexistuje.');
 {opat zapneme kontrolu chyb}
 {$I+}
end.

Všimnite si, že ak za zloženou zátvorkou { nasleduje dolár $, už to nie je poznámka, ale direktíva prekladača.

Ďalšie operácie

Tu je zopár užitočných procedúr a funkcií:

  • Erase(súbor) - zmaže súbor z disku. Parametrom je premenná typu súbor. Ten už musí byť priradený cez Assign, ale ešte nie otvorený (pomocou Reset, Rewrite,...).
  • FilePos(súbor) - vráti aktuálnu pozíciu v otvorenom súbore (nesmie byť textový).
  • FileSize(súbor) - vráti celkový počet záznamov v otvorenom súbore (ten nesmie byť textový).
  • Rename(súbor, nový_názov) - premenuje priradený (ale ešte nie otvorený) súbor na nový_názov.
  • Seek(súbor, pozícia) - posunie ukazovateľ v otvorenom súbore na záznam s danou pozíciou. Súbor nesmie byť textový.
Hodnotenie
1 2 3 4 5 (ako v škole)
Priemerná známka: 2,44
Diskusia k tejto stránke ahoj potrebujem poradit da sa vymazat cast textove...
Prejsť do diskusie»
2005-2012, Matúš Sulír, matus.sulir (zav) gmail bodka com. Gen.: 0,1399 s. Valid XHTML, CSS.