Darbas su failais Spausdinti
( 1 Vote )
Parašė Aurimas Šimkus   

  Programuojant Prolog neretai prireikia naudotis failų įvestimi/išvestimi. Failai naudojami tekstinei informacijai, žinių bazėms (statiniams ir dinaminiams termams), Prolog užklausoms saugoti.

PS prieš šitas pamokas būtinai perskaitykite pamoką apie prolog įvestį ir išvestį, kur galėsite susipažinti su naudojamais teksto rašymo ir gavimo predikatus.

 

Failų skaitymas

Failų skaitymui naudojami šie predikatai:

  • see(F) - atidaromas failas F (nurodomas kelias iki jo) ir paruošiamas skaitymui. 
  • seeing(F) - patikrina arba parodo, kuris failas šiuo metu skaitomas. 
  • seen - uždaro šiuo metu aktyvaus failo skaitymą.

Procedūros pavyzdys viso failo nuskaitymui ir atspausdinimui:

skaityti:-
        see('c:/failas.txt'),       
        repeat,                     
        get_char(T), write(T),
        T=end_of_file, 
        !,
        seen.

Pirmoje eilutėje atidaromas failas skaitymui. Antrojoje apibrėžiamas toliau procedūroje esančių predikatų kartojimas, kol bent vienas iš jų grąžins false (T=end_of_file). Trečiojoje eilutėje yra nuskaitomas vienas simbolis iš failo ir atspausdinamas konsolėje. Penktojoje tikrinama, ar jau pasiekta failo pabaiga. end_of_file atomą gražina būtent get_char predikatas (get predikatas grąžintų -1). Predikatas ! naudojamas tam, kad pasibaigus procedūrod vykdymui nebūtų prašoma jokio kito pasirinkimo, procedūra būtų baigiama. Seen uždaro skaitomą failą.

Jeigu failo turinys būtų toks:

   Laba diena, pasauli
  man jau 15!

Procedūra skaityti atspausdintų:

?- skaityti.
 Laba diena, pasauli
 man jau 15!end_of_file
 true.

Tačiau laikantis ISO standarto, failus skaityti reikėtų naudojantis šiais predikatais:

  • open(Failo_adresas, read, Failo_kintamasis) - read nurodo, kad bus skaitoma
  • close(Failo_kintamasis)

Minėtas pavyzdys pagal ISO standartą:

process :-
        open('c:/failas.txt', read, F),
        get_char(F, T),
        apdoroti(F, T),
        close(F).
 
apdoroti(_, end_of_file) :- !. /*nuskaitomas pabaigos simbolis, išeinama iš rekursijos*/

apdoroti(F, T) :- 
        write(T),
        get_char(F, T2),
        apdoroti(F, T2). /*sudaroma rekursija, kol nepasiekiama failo pabaiga*/

Toks pat principas naudojamas ir dirbant su tinklo (TCP) srautu.

PS Failo adresą taip pat galima gauti ir kaip kintamąjį per užklausą.

PS2 Čia pateiktas žemo lygio failo tvarkymas. Aukšto lygio tvarkymui reikėtų naudoti specializuotas bibliotekas.

 

Failo įrašymas 

Failų įrašymui naudojami šie predikatai:

  • tell(F) - failas F atidaromas įrašymui.
  • telling(F) - patikrina, koks faials šiuo metu yra įrašinėjamas.
  • told - išsaugomas ir išjungiamas įrašomas failas.
  • open(Failo_adresas, write arba append, Failo_kintamasis) - ISO predikatas failo atidarymui įrašymui (write) arba pildymui (append).
  • close(Failo_kintamasis) - ISO predikatas failo uždarymui.

Įrašymo į failą procedūros pavyzdys, kai į failą įrašomas apskaičiuotas siunčiamas matematinis reiškinys:

apsk_ir_irasyk(Kur, Ka) :- 
     tell(Kur),
     X is Ka, 
     write(X),
     told.

Vykdymo pavyzdys:

?- apsk_ir_irasyk('c:/failas.txt', 5*8-4).
 true.

Atsidarę failą 'c:/failas.txt' rasime įrašyta 36.

Pateikiame ir kitą failo įrašymo pavyzdį pagal ISO standartą. Vartotojas įveda aritmetinius veiksmus, programa atsakymus rašo į failą. baigiama įvedus 'pab'.

vykdymas(Kur) :-
      open(Kur, append, F),
      rasymas(F,_),
      close(F).

rasymas(F,_) :-
      read(X), 
      X \= 'pab' -> 
      (
        Rez is X, 
        write(F,X), write(F,'='), write(F,Rez), nl(F),
        rasymas(F,X) /*kvieciama rekursija, užklausa kartojama*/
      ); true. /*dėl sėkmingo failo uždarymo grąžinamas true*/ 

Vartotojo prašoma įvesti veiksmą. Jei X nėra 'pab', vykdys predikatus skliausteliuose, kitaip spausdins true. Apskaičiuojamas veiksmas X ir priskiriamas Rez.

Vykdymo pavyzdys:

?- vykdymas('c:/failas.txt').
 |: 2+2.
 |: 8*9-4+2.
 |: pab.
 true.

Po vykdymo faile 'c:/failas.txt' rasime tekstą:

   2+2=4
   8*9-4+2=70