Práca s textovými súbormi

Metodický materiál

 

 

 

 

 

Autor:

Michal Gondek, gondek@mikey.sk

V Bratislave, 31. mája 2004

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


1.          Obsah

1.   Obsah. 2

2.   Úvod. 4

2.1.       Východiská. 4

2.2.       Ciele. 4

3.   Základy práce s textovým súborom.. 5

3.1.       Vstup zo súboru a výstup do súboru.. 5

3.2.       Textové súbory.. 5

3.3.       Základné operácie s textovým súborom... 5

3.4.       Práca s textovým súborom... 5

3.5.       Testovanie konca súboru a konca riadku.. 6

4.   Čítanie textového súboru.. 7

4.1.       Výpis textového súboru na obrazovku.. 7

4.2.       Šablóna na spracovanie textového súboru.. 7

4.2.1.         Doplňujúce príklady.. 8

4.3.       Vylepšenie výpisu súboru na obrazovku.. 8

4.4.       Úlohy.. 9

5.   Zápis do textového súboru.. 10

5.1.       Spojenie dvoch súborov.. 10

5.2.       Spojenie dvoch súborov pomocou Append.. 11

5.3.       Nahradenie malých písmen veľkými 11

5.4.       Jednoduchý šifrovací program... 12

5.5.       Jednoduchý dešifrovací program... 12

5.6.       Úlohy.. 13

6.   Čítanie a zápis čísel. 14

6.1.       Zapisovanie celých čísel 14

6.2.       Čítanie čísel 14

6.3.       Zápis reálnych čísel 15

6.4.       Úlohy.. 15

2.          Úvod

Tento materiál by mal slúžiť ako pomôcka pre učiteľa k vyučovaniu textových súborov v programovacom jazyku pascal. Vznikol na ako semestrálny projekt v rámci predmetu Didaktika programovania.

2.1.               Východiská

Pre použitie tohto materiálu predpokladáme u žiakov nasledujúce znalosti:

 

Ř      práca s premennými

Ř      práca s cyklami

Ř      práca so znakovými reťazcami

Ř      používanie procedúr

Ř      práca s unitom CRT

 

2.2.               Ciele

Žiaci by mali získať zručnosti s čítaním textového súboru, zápisom do textového súboru a taktiež jeho vytvorením.

 

 

 

3.           Základy práce s textovým súborom

3.1.               Vstup zo súboru a výstup do súboru

V súčasných programoch sa pre väčšinu vstupov používajú súbory. Užívateľ programu zadáva z klávesnice maximálne niekoľko krátkych údajov, ale určite nie stovky, tisíce čísel. Presne tak aj programy, okrem práce s obrazovkou, umožňujú aj zápis svojej práce do súboru. Preto je nevyhnutné prácu so súbormi bezpečne ovládať.

 

Súbor je postupnosť po sebe nasledujúcich bajtov od začiatku až po koniec súboru. O to, aby sme tieto bajty dostali v správnom poradí sa stará operačný systém.

 

3.2.               Textové súbory

Textový súbor je postupnosť znakov spolu so špeciálnymi znakmi ako <eoln>. Všetky údaje sú v súbore zapísané ako ASCII znaky.

 

 

3.3.               Základné operácie s textovým súborom

 

Ř      read – čítanie nasledujúcej hodnoty zo súboru

Ř      write – zápis na koniec súboru

 

3.4.               Práca s textovým súborom

 

Deklarácia premennej f, pomocou ktorej budeme pristupovať k textovému súboru:

 

 

Priradenie súboru DATA.TXT k premennej f. Cestu k súboru môžeme zadať relatívnou adresou, ale tiež absolútnou. Je vhodné upozorniť na riziko spojené s prenosom programu pri absolútnej adrese k súboru.

 

 

Otvorenie súboru na čítanie. Takýto súbor musí existovať.

 

 

Otvorenie súboru na zápis. Ak súbor existuje tak sa vymaže.

 

 

Otvorenie súboru na zápis od konca existujúceho súboru.

 

 

Čítanie zo súboru.

 

 

Zápis do súboru.

 

 

Zatvorenie súboru.

 

 

3.5.               Testovanie konca súboru a konca riadku

 

4.           Čítanie textového súboru

4.1.               Výpis textového súboru na obrazovku

Majme textový súbor a chceme si spraviť program, ktorý nám náš súbor vypíše na obrazovku.

 

program VypisSuborNaObrazovku;

 

var c : char;

    s : text;

 

begin

  assign(s,'data.txt');

  reset(s);

 

  while not( eof( s ) ) do begin

    while not( eoln( s ) ) do begin

      read(s, c);

      write(c);   // spracovanie znaku

    end;

    readln(s);

    writeln;   // spracovanie konca riadka

  end;

 

  close(s);

end.

 

Ř      Príkazom assign sme premennej s v našom programe priradili fyzicky súbor „data.txt“.

Ř      Príkazom reset(s) otvoríme súbor na čítanie.

Ř      Znaky z textového súboru sa čítajú sekvenčne, jeden za druhým.

 

Prvý cyklus sa nám bude teda vykonávať pokiaľ nedosiahneme koniec súboru, a cyklus druhý, vnorený v prvom cykle, sa bude vykonávať pokiaľ program nedosiahne koniec riadku súboru.

 

4.2.               Šablóna na spracovanie textového súboru

 

Keď sa pozrieme na náš program vidíme, že ho môžeme používať ako vzor, či šablónu na spravovanie textového súboru.

 

 

 

 

 

var c : char;

    s : text;

 

begin

  assign(s,'data.txt');

  reset(s);

 

  while not( eof( s ) ) do begin

    while not( eoln( s ) ) do begin

      read(s, c);

 

      // miesto pre spracovanie znaku //

 

    end;

    readln(s);

 

    // miesto pre spracovanie konca riadka //

 

  end;

 

  close(s);

end.

 

4.2.1.           Doplňujúce príklady

Je vhodné aby tieto príklady študenti spravili priamo na hodine.

 

  1. Ako by sme upravili predchádzajúci program, keby sme o súbore chceli vedieť počet znakov súboru? (Hint: zadeklarujeme premennú, v ktorej si budeme počítať počet znakov súboru).
  2. Ako by sme upravili predchádzajúci program, keby sme chceli vedieť počet medzier v súbore. (Hint: porovnaním práve prečítaného znaku so znakom medzery zistíme či je spracovávaný znak medzera).
  3. Ako by sme upravili predchádzajúci program, keby sme o súbore chceli vedieť počet riadkov súboru? (Hint: počítame konce riadkov súboru).
  4. Ako by sme upravili predchádzajúco program, ak by sme nechceli stále prepisovať cestu k súboru, ale mohli zadať názov súboru, ktorý  sa má vypísať. (Hint: zadať cestu z klávesnice).

 

4.3.               Vylepšenie výpisu súboru na obrazovku

Ak ste si predchádzajúcim programom dali na obrazovku vypísať súbor, ktorý bol dlhší, určite vám vadilo, že ste nepostrehli jeho začiatok. Teraz si skúsime upraviť program tak, aby nám po vypísaní jednej obrazovky výpis zastal a pokračoval po stlačení ľubovoľného klávesu.

Hint: Nechať žiakov porozmýšľať nad počtom riadkov ktorý sa zmestí na obrazovku (25), a ako vylepšiť predchádzajúci program aby po tomto počte riadkov už nevypisoval ale čakal na stlačenie klávesnice.

Riešenie:

 

program VypisSuborNaObrazovku_2;

uses CRT;      

var c : char;

    s : text;

    p : integer;  //pocet vypisanych riadkov

begin

  pocet_vypisanych_riadkov:=0;

  assign(s,’vstupny_subor.txt’);

  reset(s);

  while not(eof(s)) do begin

    while not(eoln(s)) do begin

      read(s,c);

      write(c);

    end;

 

    readln(s);

    inc(p);

    if (p)=25 then begin

      p:=0;             // vynulovanie poctu riadkov

      readkey;      // cakanie na klaves

    end;

    writeln;

 

  end;

  close(s);

end.

 

4.4.               Úlohy

  1. Spravte program, ktorý
    1. spočíta počet znakov najdlhšieho riadku
    2. spočíta počet slov najdlhšieho riadku
    3. vypíše najdlhší riadok na obrazovku
    4. vypíše na obrazovku riadok, v ktorom sa nachádza najviac slov

 

  1. Urobte program, ktorý spočíta počet slov končiacich sa písmenom „a“:
    1. v najdlhšom riadku
    2. v celom súbore
    3. v riadku s najväčším množstvom slov

 

  1. Urobte program, ktorý nám vypíše najdlhšie slovo končiace sa písmenom "a":
    1. v najdlhšom riadku
    2. v celom súbore
    3. v riadku s najväčším množstvom slov

 

5.            Zápis do textového súboru

 

 

Ř      ukazovateľ v súbore je vždy nastavený na jeho koniec

Ř      príkaz write(f, znak ) zapíše do súboru jeden znak

Ř      príkaz write(f, reťazec ) zapíše kompletný reťazec

Ř      príkaz writeln(f) zapíše do súboru značku <Eoln>

Ř      príkaz writeln(t, reťazec ) je skrátený tvar pre write(t, reťazec ); writeln(t);

 

5.1.               Spojenie dvoch súborov

Ukážeme si príklad v ktorom spojíme dva súbory do jedného. Na vstupe budeme mať dva textové súbory a vytvoríme tretí ktorý bude ich spojením.

 

program spojenie_suborov;

var c : char;

    s1, s2, s3 : text;

begin

  assign(s1,'vstup1.txt'); reset(s1);

  assign(s2,'vstup2.txt'); reset(s2);

  assign(s3,'vystup.txt'); rewrite(s3);

  while not(eof(s1)) do begin

    while not(eoln(s1)) do begin

      read(s1,c);

      write(s3,c);

    end;

    readln(s1);

    writeln(s3);

  end;

  close(s1);

  while not(eof(s2)) do begin

    while not(eoln(s2)) do begin

      read(s2,c);

      write(s3,c);

    end;

    readln(s2);

    writeln(s3);

  end;

  close(s2);

  close(s3);

end.

5.2.               Spojenie dvoch súborov pomocou Append

V tomto príklade si ukážeme použitie "APPEND". K prvému textovému súboru pripojíme druhý, bez použitia tretieho súboru.

 

program spojenie_suborov_2;

var c : char;

    s1, s2 : text;

begin

  assign(s1,'vstup1.txt'); append(s1);

  assign(s2,'vstup2.txt'); reset(s2);

  while not(eof(s2)) do begin

    while not(eoln(s2)) do begin

      read(s2,c);

      write(s1,c);

    end;

    readln(s2);

    writeln(s1);

  end;

  close(s1);

  close(s2);

end.

 

5.3.               Nahradenie malých písmen veľkými

Nasledujúci príklad prerobí všetky malé písmena na veľké.

 

program nahradenie_pismen;

var s1,s2:Text;

    c:char;

begin

  assign(s1,'vstup.txt'); reset(s1);

  assign(s2,'vystup.txt'); rewrite(s2);

  while not(Eof(s1)) do begin

    read(s1,c);

    if (c>='a') and (c<='z') then

      c:=chr(ord(c)-ord('a')+ord('A'));           

    write(s2,c);

  end;

  close(s1);

  close(s2);

end;

 

5.4.               Jednoduchý šifrovací program

Teraz si vytvoríme jednoduchý šifrovací program, ktorý posunie každé písmeno na jeho nasledujúce v abecede(a->b,b->c, … z->a, A->B,….Z->A). Všetky ostatné znaky ponechá presne tak ako sú.

 

program sifrovac;

var s1,s2:Text;

    c:char;

begin

  assign(s1,'vstup.txt'); reset(s1);

  assign(s2,'vystup.txt'); rewrite(s2);

  while not(Eof(s1)) do begin

    read(s1,c);

    if (c>='a') and (c<='z') then

      c:=chr(((ord(c)+1-ord('a')) mod 32)+ord('a'));           

    if (c>='A') and (c<='Z') then

      c:=chr(((ord(c)+1-ord('A')) mod 32)+ord('A'));           

    write(s2,c);

  end;

  close(s1);

  close(s2);

end;

 

5.5.               Jednoduchý nešifrovací program

K predchádzajúcemu programu by sa nám hodil aj program na rozšifrovanie zašifrovaného súboru.

 

Program desifrovac;

var s1,s2:Text;

    c:char;

begin

  assign(s1,'vstup.txt'); reset(s1);

  assign(s2,'vystup.txt'); rewrite(s2);

  while not(Eof(s1)) do begin

    read(s1,c);

    if (c>='a') and (c<='z') then

      c:=chr(((ord(c)-1-ord('a')) mod 32)+ord('a'));           

    if (c>='A') and (c<='Z') then

      c:=chr(((ord(c)-1-ord('A')) mod 32)+ord('A'));           

    write(s2,c);

  end;

  close(s1);

  close(s2);

end;

 

5.6.               Úlohy

  1. Vytvorte kópiu daného textového súboru tak, že vynecháte:
    1. prebytočné medzery (za sebou idúce medzery nahradíte iba 1 medzerou)
    2. prebytočné medzery (za sebou idúce medzery nahradíte iba 1 medzerou) a prázdne riadky
  2. Vytvorte textový súbor, ktorý vznikne zo vstupného, nasledovne :
    1. všetky malé písmena zmení na veľké a všetky veľké na malé
    2. skontroluje, či každé písmeno na začiatku vety je veľké, ak nie je, tak ho zmení na veľké  (písmeno na začiatku vety - prvé písmeno, ktoré nasleduje za bodkou)

 

6.           Čítanie a zápis čísel

Do textového súboru môžeme zapisovať aj čísla (celé aj reálne).

6.1.               Zapisovanie celých čísel

Spravme si program, ktorý zapíše do súboru 10 náhodných celých čísel z intervalu 0..20.

 

uses crt;

var i,cislo:integer;

    s:text;

begin

  assign(s,‘vystup.txt);

  rewrite(s);

  randomize;

  for i:=1 to 10 do begin

    cislo:=random(21);

    write(s,cislo);

  end;

  writeln(s);

  close(s);

end.

 

Ak si pozrieme výstupný súbor môžeme spozorovať, že všetky čísla sú zapísané za sebou a nič ich neoddeľuje. Takto zapísané čísla by sa nám asi ťažko podarilo správne prečítať. Preto keď zapisujeme čísla musíme ich oddeliť medzerou, tabulátorom, alebo koncom riadku.

 

Úloha: Upravte program aby zapisoval čísla korektne.

6.2.               Čítanie čísel

Predpokladajme, že máme korektne uložené čísla, aj s medzerami. Teda nie tak ako programom s predchádzajúceho príkladu. Potom ich môžeme čítať takýmto jednoduchým spôsobom .

 

var cislo:integer;

    s:text;

begin

  assign(s,'vstup.txt'); reset(s);

  while not(eof(s)) do begin

    while not(eoln(s)) do begin

      read(s,cislo);

      write(cislo,’ ’);

    end;

    readln(s); writeln;

  end;

  close(s);

end.

Podobným spôsobom môžeme čítať aj reálne čísla.

Upozornenie: Pri čítaní čísel musíme presne poznať formát textového súboru. Resp. čísla čítame zo súboru, keď v zadaní úlohy bude zadaný presný formát súboru a bude sa uvádzať, že súbor je vytvorený korektne. Ak sa pokúsime čítať číslo a v súbore je nejaký iný znak, pascal nám vyhlási chybu: Invalid numeric format.

6.3.               Zápis reálnych čísel

Reálne čísla sa do súboru zapisujú v semilogaritmickom tvare s medzerou pred číslom. Tak ako sme vedeli ovplyvniť zarovnanie znakov pri výpise na obrazovku, rovnako môžeme aj pri formátovaní výpisu reálneho čísla.

 

-         vypíše číslo na šírku štyroch znakov. Ak sa číslo nezmestí do predpísanej šírky, formát sa ignoruje.

 

-         znamená, že číslo sa vypíše na šírku štyroch znakov a z toho dva znaky budú obsadené desatinnou časťou.

 

6.4.               Úlohy

  1. Vytvorte program, ktorý zo vstupného textového súboru (je korektný a obsahuje len celé čísla) vypíše maximálne číslo.
  2. Vytvorte program, ktorý bude šifrovať vstupný textový súbor do výstupného tak, že všetky znaky v ASCII tabuľke posunie o k znakov vpravo (hore). Hodnotu k si náhodne vygeneruje pre každý riadok zvlášť a uloží ju na začiatok prislúchajúceho riadku výstupného súboru. Za hodnotu zapíše jednu medzeru a potom samotný zašifrovaný text riadku vstupného súboru.
  3. Vytvorte program, ktorý rozšifruje výstupný súbor z úlohy číslo 2.