Sunteți pe pagina 1din 6

Tema8: Lucrul cu fiiere.

Fiier este numit (adic care are numele) colectivitatea de date, nscrise pe disc.

Implicit dispozitivul de introducere a informaiei (dispozitivul de citire) n Turbo-Prolog este tastatura, iar
dispozitivul de ieire (dispozitivul de nscriere) - monitorul. Pentru a avea acces ctre datele fiierului, este
necesar ca acesta s fie deschis. Fiierul poate fi deschis pentru citirea, nscrierea, adugarea sau modificarea
datelor din fiier. Fiierul deschis pentru oricare aciune, n afar de citire, trebuie s fie nchis la sfritul
operaiei, altfel modificrile nu se vor salva.
Dup ce fiierul s-a deschis, Turbo-Prolog leag numele fiierului logic cu numele fiierului fizic. Numele
fiierului fizic este numele fiierului n sistemul de operare. Numele logic este utilizat de Turbo-Prolog pentru
readresarea canalelor intrare/ieire.
Numele fiierului logic se descrie n seciunea domeniilor n urmtorul mod:

file = <numele logic pentru fiierul 1>;...;


< numele logic pentru fiierul N>

La descrierea domeniilor fiier tipul domeniului file se amplaseaz n partea stng de egalitate, iar numele
logic al fiierului n dreapta. Numele simbolic al fiierului trebuie s se nceap cu o liter minuscul :
file=datafile
n descrierea fiierului pot fi indicate cteva nume logice, dar descrierea trebuie s fie una singur. De exemplu:
file=datafile1; datafile2; datafile3.
Concomitent pot fi deschise mai multe fiiere i canale de intrare/ieire pot fi readresate ntre fiierile deschise
(readresarea ocup mai puin timp dect deschiderea i nchiderea fiierilor).

Predicatele ncorporate n Prolog destinate lucrului cu fiierile:


openread(<numele logic al fiierului>,< numele fizic al fiierului >) deschide fiierul pentru citire. Dac
fiierul cu numele extern indicat nu va fi gsit, predicutul sufer o nfr i extrage mesajul corespunztor despre
eroare.
openwrite(<numele logic al fiierului >,< numele fizic al fiierului >) deschide fiierul pentru nscriere. Acest
predicat creiaz pe disc un nou fiier. Dac fiierul cu acest nume deja exist, el se cur.
openappend(<numele logic al fiierului>,< numele fizic al fiierului >) deschide fiierul numai pentru
adugarea informaiei la sfritul fiierului. Dac fiierul nu este gsit, predicatul extrage mesajul de eroare.
readdevice(<numele dispozitivului sau fiierului logic >) readreseaz canalul de intrare spre dispozitivul
indicat sau fiier, deschizndu-l pentru citire.
writedevice (<numele dispozitivului sau fiierului logic >)- readreseaz canalul de ieire spre dispozitivul
indicat sau fiier, deschizndu-l pentru nscriere sau adugare.
openmodify (<numele logic al fiierului>,< numele fizic al fiierului >)- deschide fiierul concomiten pentru
citire i nscriere. Dac fiierul cu numele indicat nu va fi depistat, predicatul extrage mesajul de eroare
filepos (<numele logic al fiierului >,<poziia n fiier>, <regimul>) se utilizeaz n lucrul cu fiierele cu
acces direct.
<poziia n fiier>- indic poziia din care va fi citi sau n care va fi nscris simbolul.
<regimul>- poate luc una din trei valori: 0,1,2.

0 Deplasarea se ea fa de nceputul fiierului

1 Deplasarea se ea fa de poziia curent

2 Deplasarea se ea fa de sfritul fiierului


De exemplu:
- filepos(f,100,0)
cursorul se deplaseaz ctre poziia 100 de la nceputul fiierului;
- filepos(f,100,1)
cursorul se deplaseaz cu 100 poziii spre dreapta fa de poziia curent n fiier;
- filepos(f,-100,1)
cursorul se deplaseaz cu 100 poziii spre stnga fa de poziia curent n fiier;
- filepos(f,100,2)
cursorul se deplaseaz ctre poziia 100 poziii spre stnga fa de sfritul fiierului;
existfile (<numele fizic al fiierului >) verific, dac fiierul cu numele indicat exist. Predicatul este adevr,
dac fiierul cu numele indicat exist, i fals n caz contrar.
eof(<numele fizic al fiierului >) predicatul este cu succes, dac se ajunge la sfritul fiierului.
closefile(<numele fizic al fiierului>) inchide fiierul deschis. Predicatul n orice caz este cu succes, chiar dac
fiierul corespunztor nu a fost deschis.
deletefile (<numele fizic al fiierului >) lichideaz fiierul cu numele indicat.
renamefile (<numele fizic al fiierului >,(< numele fizic nou al fiierului >) modific numele fiierului.
Dac fiierul nu exist, numele cruia este indicat n primul parametru, predicatul va extrage un mesaj de
eroare.
disk(<calea>) permite s indicm sau s aflm discul/mapa curent, n dependen de faptul, dac unicul lui
argument este liber sau legat.
save(<numele fizic al fiierului >)- salveaz fiierul pe disc.

Lucrul cu datele, ce se pstreaz n fiiere, se numete prelucrarea fiierelor. Ctre operaiile tipice aplicate
asupra fiierilor se refer:
crearea fiierului
nscrierea n fiier
citirea din fiier
modificarea fiierului deja existent
adugarea datelor noi n fiier.

La mod general crearea/nscrierea n fiier pote fi reprezentat prin urmtoarele consecutiviti de aciuni:
openwrite(f, exemplu.txt),
writedevice(f),
<predicatul de nscriere n fiier>,
closefile(f).

Citirea informaiei din fiier :


openread(f, exemplu.txt),
readdevice(f),
<predicatul de citire din fiier>,
closefile(f).
Modificarea fiierului deja existent:
openmodify(f, exemplu.txt),
readdevice(f),
writedevice(f),
<predicatul pentru citirea selectiv i nscriere n fiier >,
closefile(f).

Adugarea n fiier :
openappend(f, exemplu.txt),
writedevice(f),
<predicatul pentru nchiderea fiierului >,
closefile(f).

Exemple de programe utilizate la prelucrarea fiierilor.


Exemplu 1. Elaborai un program care va forma un fiier din iruri introduse de la tastatur. Numele fiierului
se citete de la tastatur. Executai verificarea de existen a fiierului.
Mai nti de toate stabilim predicatele i domeniile predicatelor:
Pentru citirea numelui de la tastatur definim predicatul nume(string). Predicatul va avea un parametru, ce
reprezint numele extern al fiierului.
Predicatul create_f(string) va avea un singur parametru (numele extern al fiierului), care va realiza verificarea
de existen a fiierului cu numele indicat. n dependen de rspunsul (veridicitatea) expresiei -
not(existfile(X)), fie c se va forma un fiier nou cu numele indicat i se va apela regula de citire/nscriere a
irurilor n fiier, fie va fi propus introducerea unui nume nou fiierului.
n continuare definim predicatul de citire a irurilor de la tastatur i nscrierea lor n fiier- scrie. Predicatul nu
are argumente.

Pentru stoparea inscrierii introducem predicatul verificare(string). Parametru este un ir. Citirea de la tastatur i
nscrierea n fiier se execut pn la introducerea irului "end" .
Ultimul predicat start execut rolul de scop n program. Nu are parametri.

Amplasai cursorul n fereastra de redactare i introducei textul programului. salvai fiierul atribuindu-i
numele FISIER1.PRO.

domains
file=f /* f numele intern al fiierului */

predicates /* seciunea de descriere a predicatelor */

scrie
verificare(string)
start
create_f(string)
nume(string)
clauses
nume(X) if write("introduceti numele de fisier : "), /* extragerea mesajului la ecran*/

readln(X). /* citete numele fiierului n variabila X */

create_f(X) if not(existfile(X)), /*verificarea de existena a fiierului cu numele X */


openwrite(f,X), /* leag numele fiierul extern X cu variabila fiier f, i-l deschide pentru
nscriere */

scrie, /* apelul regulei scrie */


closefile(f). /* nchiderea fiierului */

create_f(X) if write("cu nume " ,X, " exista fisier"), /* extragerea mesajului la ecran */
nl,start. /* apelul regulilei start */

scrie if nl, readln(L), /* citete irul n variabila L */


writedevice(f), /*redirecteaz ieirea ctre fiierul f */
write(L), /* nscrie irul n fiier */

verificare(L). /* apelul regulilei verificare*/

verificare("end") if !. /* dac"end" stopeaz citirea datelor */


verificare(_) if scrie . /* continu citirea, apelul regulei scrie*/

start if nume(X),create_f(X). /* apelul regulilei nume i create_f */

Exemplu 2. Elaborai un program, care citete datele din fiier i le afi la ecran. Numele fiierului s se
introduc de la tastatur. Executai verificarea de existen a fiierului.
Definim predicatele i domeniile predicatelor:
Predicatul nume(string), ca i n exemplul precedent, servete pentru citirea numelui fiierului de la tastatur.
Predicatul open_f(string) va executa verificarea de existen a fiierului cu numele indicat. Dac existfile(X) are
valoarea adevr s deschid fiierul pentru citire, n caz contrar s afie mesajul de eroare i s ne propun
introducerea unui nume nou pentru fiier.
Predicatul citire - fr parametri, execut citirea datelor din fiier i afiarea lor la ecran.
Predicatul start execut rolul de scop n program. Nu are parametri.

Intrai n fereastra de redactare i introducei textul programului. Salvai fiierul atribuindu-i numele
FISIER2.PRO.

domains
file=f
predicates
citire
start
open_f(string)
nume(string)
clauses
nume(X) if write("introduceti numele de fisier : "),readln(X).

/* citete numele fiierului n variabila X */


open_f(X) if existfile(X), /* verific dac exist fiier cu numele X */
openread(f,X) /* leag numele extern X al fiierului cu
variabila fiier f i-l deschide pentru citire */
readdevice(f), /* redirecteaz intrarea ctre fiierul f */

citire, /* apelul regulilei citire */


closefile(f). /* nchide fiierul */

open_f(X) if write("cu nume " ,X, " nu exista asa fisier"),nl,start.


/* extrage un mesajul, dac predicatul existfile euiaz i apelul regulilei start*/
citire if nl, not(eof(f)), /* dac fiierul f nu s-a finisat */
readln(L), /* citete din el un ir */
write(L), / * afi irul la ecran */

citire. /* continu procesul */

citire. /* aceast continuare este necesar, ca predicatul s nu euieze, cnd se va ajunge la sfritul fiierului
*/

start if nume(X),open_f(X). /* apelul regulilei nume i open_f */

Exemplu 3. Elaborai un program, care citete datele din fiier din poziia indicat i le afi la ecran. Numele
fiierului i numrul poziiei se vor citi de la tastatur. Executai verificarea de existen a fiierului.

Intrai n fereastra de redactare i copiai textul programului din exemplul 2. Executai modificrile conform
textului prezentat mai jos. Salvai fiierul atribuindu-i numele FISIER3.PRO.

domains existfile(X),openread(f,X),readdevice(f),
file=f filepos(f,P,0), /* modific poziia de citire */
predicates citire,closefile(f).
citire. open_f(X) if write("cu nume " ,X, " nu exista asa
start fisier"),nl,start.
open_f(string) citire if nl, not(eof(f)), readln(L),write(L),citire.
nume(string) citire.
clauses start if nume(X),open_f(X).
nume(X) if write("introduceti numele de fisier :
"),readln(X).
open_f(X) if nl,write("introduceti pozitia:
"),readint(P),

S-ar putea să vă placă și