CATEGORII DOCUMENTE |
Lucrul cu fisiere
Prin fisier se intelege colectie ordonata de elemente pe care le numim inregistrari. Fisierele sunt pastrate pe suporturi externe reutilizabile: hard disk, floppy disk, etc. Prelucrarea fisierelor implica un numar de operatii specifice acestora:
Operatiile specifice fisierelor se realizeaza prin intermediul unor functii standard existente in biblioteca limbajului C. Exista doua nivele de tratare a fisierelor:
Nivelul inferior - face apel direct la sistemul de operare
Nivelul superior - face apel la proceduri specializate de prelucrare a fisierelor, care utilizeaza structuri speciale de tipul FILE.
Nivelul inferior de prelucrare a fisierelor
Pentru a putea prelucra un fisier la nivel inferior acesta trebuie sa fie creat in prealabil.
int creat (const char* cale, int mod );
Unde:
cale - este un pointer spre un sir de caractere prin care este specificat numele complet al fisierului (calea)
mod - un numar intreg prin care se specifica modul de acces al proprietarului la fisier. Acest mod poate fi definit folosind constante simbolice:
S_IREAD - proprietarul poate citi fisierul
S_IWRITE - proprietarul poate scrie fisierul
S_IEXE - proprietarul poate executa programul continut de fisierul respectiv
Utilizarea acestei functii implica includerea fisierelor: io.h si stat.h.
Observatie: Indicatorii de mod pot fi combinati. Astfel pentru a crea un fisier in care avem drepturi de scriere si citire vom utiliza constructia: S_IREAD|S_IWRITE.
Functia creat returneaza un numar intreg care are semnificatia descriptorului de fisier (daca este pozitiv) sau eroare (daca este -1).
Descriptorul de fisier este reprezinta un numar intreg pozitiv atasat fisierului prelucrat, prin intermediul caruia se identifica un fisier in operatiile specifice realizate asupra acestuia.
Deschiderea fisierului se realizeaza prin apelul functiei open al carei prototip este:
int open (const char* cale, int acces );
Utilizarea acestei functii presupune includerea fisierelor io.h si fcntl.h:
#include <io.h>
#include <fcntl.h>
cale - pointer la un sir de caractere prin care se specifica calea completa a fisierului ce va fi deschis.
acces - intreg prin care se specifica modul de acces la fisier:
O_RDONLY - numai in citire
O_WRONLY- numai in scriere
O_RDWR - citire-scriere
O_APPEND - adaugare la sfarsitul fisierului
O_BINARY - prelucrare binara
O_TEXT - prelucrare text
Valorile de acces pot fi combinate prin caracterul '|' , spre exemplu:
O_RDONLY|O_BINARY
Functia returneaza un intreg nenegativ (descriptorul de fisier) sau -1 in caz de eroare.
Exemplu
int df;
df=open("nume.txt",O_APPEND);
Observatii:
Daca nu este specificata complet calea fisierului, se considera implicit calea curenta.
Calea completa a unui fisier este specificata printr-un sir de caractere de forma:
Litera:Dir1 Dir2 .. Dir
Unde:
Litera poate fi A,B,C . reprezinta litera de identificare a discului (ex: C - harddisk, A - floppy disk)
Dir1, DIr2, . sunt nume de subdirectoare
Daca specificam calea fisierului in apelul functiei open, toate caracterele trebuie dublate
Exemplu
int df;
df = open ("C:Borlandcbintext.cpp", O_RDWR);
Se realizeaza prin functia read, prototipul acesteia se afla in fisierul io.h:
int read(int df, void *mem, unsigned lung);
unde:
df - descriptorul atasat fisierului (returnat de functia open)
mem - pointer spre zona de memorie in care se va pastra inregistrarea citita din fisier
lung - lungimea inregistrarii exprimata in numar de octeti
Functia read returneaza un intreg reprezentand numarul de octeti cititi din fisier sau: -1 in caz de eroare, 0 la terminarea fisierului
Efectul: Prin apelul functiei read se citeste din fisier inregistrarea curenta; la un apel urmator se va citi urmatoarea inregistrare, s.a.m.d pana la sfarsitul fisierului.
Exemplu: citirea din fisier caracter cu caracter pana la terminarea fisierului si afisarea pe monitor a continutul acestuia:
int df, i;
char c;
df=open("proba.txt",O_RDONLY);
dowhile (i>0);
Scrierea in fisier
Functia write , prototipul acesteia se afla in fisierul io.h:
int write(int df, void *mem, unsigned lung);
unde:
df - descriptorul atasat fisierului (returnat de functia open)
mem - pointer spre zona de memorie din care se preia informatia ce se va scrie in fisier
lung - lungimea inregistrarii exprimata in numar de octeti
Functia write returneaza un intreg reprezentand numarul de octeti scrisi din fisier, in general numarul specificat de parametrul lung. Daca cele doua valori sunt diferite, este semnalat prin acesta un caz de eroare.
Exemplu: scrierea intr-un fisier a unei secvente de caractere
int df, i;
char text[30] = "Acest text se scrie in fisier!";
df=open("proba.txt",O_APPEND);
write(df, text, 30);
Pozitionarea in fisier
Citirea si scrierea in fisiere se face in mod secvential, ceea ce inseamna ca inregistrarile se scriu una dupa alta pe suportul fisierului si citirea se face in aceeiasi ordine in care au fost scrise. Daca dorim ca accesul la inregistrari sa se faca intr-o ordine diferita decat cea implicita se poate utiliza functia lseek pentru pozitionarea in fisier:
long lseek(int df, long depl, int orig);
unde:
df - descriptorul de fisier
depl - deplasamentul exprimat in numar de octeti
orig - este un numar intreg ale carui valori semnifica:
0 - deplasamentul se considera de la inceputul fisierului
1 - deplasamentul se considera din pozitia curenta
2 - deplasamentul se considera de la sfarsitul fisierului
Functia returneaza pozitia fata de inceputul fisierului.
Functia close avand prototipul:
int close (int df); //df- descriptorul de fisier
Utilizarea functiei close implica includerea fisierului biblioteca io.h
Returneaza:
0 - la inchiderea normala a fisierului
-1 - in caz de eroare
Nivelul superior de prelucrare a fisierelor
Functii de manipulare a fisierelor sunt definite in bibliotecile standard ale limbajului. Prototipurile functiilor se gasesc in fisierul antet stdio.h. Fisierul care se prelucreaza este identificat in mod unic printr-un pointer de fisier (uzual denumim acest pointer de fisier pf).
In limbajul C exista tipul de date FILE (fisier) prin care se defineste structura datelor dintr-un fisier. In declaratiile de tip vom avea nevoie de o secventa:
FILE *pf;
Deschiderea unui fisier
Functia de deschidere a unui fisier se numeste: fopen si prototipul functiei este urmatorul:
FILE *fopen(const char *nume, const char *mod);
In declaratiile de tip vom avea nevoie de o secventa:
FILE *pf, fopen();
Argumentele functiei:
nume - sir de caractere prin care se identifica numele fisierului de pe disc pe care dorim sa-l accesam.
mod - sir de caractere prin care se specifica modul de acces la fisier.
Modurile valide de deschidere a fisierului sunt:
"r" - deschidere pentru citire
"w" - deschidere pentru scriere (informatia din fisier se pierde la deschiderea in acest mod)
"a" - deschide pentru scriere (fara pierderea informatiei din fisier) sau creeaza fisier
"r+" - deschide pentru actualizare
"w+" - deschide sau creeaza fisier pentru actualizare (pierderea informatiei)
"a+" - deschide sau creeaza fisier pentru actualizare (fara pierderea informatiei anterioare)
Efectul apelarii functiei: deschide fisierul specificat prin nume in modul de acces dorit si returneaza un pointer spre structura FILE (FILE *pf) care ulterior se utilizeaza pentru a identifica fisierul in operatiile ce se efectueaza asupra sa. In caz de insucces, functia returneaza NULL.
Exemplu
FILE *pf; //pointer spre FILE
pf=fopen("fis1.dat", "r");
deschid fisierul fis1.dat pentru a putea citi informatii
if (pf==NULL)
Inchiderea fisierului
Functia de inchidere a unui fisier se numeste fclose si are prototipul:
int fclose(FILE *pf);
Argumentul functiei:
pf - pointer spre FILE, identifica fisierul ce se inchide
Functia returneaza 0 in caz de succes sau EOF (end of file) in caz de insucces.
In declaratiile de tip vom avea nevoie de o secventa:
int fclose();
Scrierea in fisier
Functia de scriere in fisier: fprintf are prototipul:
int fprintf(FILE *pf, const char* sir_format, lista_arg);
Argumentul functiei:
pf - pointer spre FILE, identifica fisierul ]n care se efectueaza scrierea
sir_format, lista_arg - au aceiasi semnificatie ca si in cazul functiei printf
Functia returneaza in caz de succes numarul de caractere scrise sau un numar negativ in caz de insucces.
Exemplu
fprintf(pf, "Rezultatul este: %d", rezultat);
Citirea din fisier
Functia de citire din fisier: fscanf are prototipul:
int fscanf(FILE *pf, const char* sir_format, lista_arg);
Argumentul functiei:
pf - pointer spre FILE, identifica fisierul din care se efectueaza citirea
sir_format, lista_arg - au aceiasi semnificatie ca si in cazul functiei scanf
Functia returneaza in caz de succes numarul de caractere citite sau un numar negativ in caz de insucces.
Exemplu:
fscanf(pf, "%d", &x);
Pozitionarea in fisier
In mod firesc accesul la inregistrarile unui fisier se produce in mod secvential, prin parcurgerea inregistrarilor de la inceputul fisierului pana la inregistrarea dorita. Functia de biblioteca fseek este utila deoarece are ca efect pozitionarea in fisier fara a fi necesara parcurgerea explicita a inregistrarilor anterioare celei cautate.
Prototipul functiei este:
int fseek (FILE *pf, long increment, int mod)
mod poate fi:
0 - daca increment - indica numarul de octeti fata de inceputul fisierului
1 - daca increment - indica numarul de octeti fata de pozitia curenta
2 - daca increment - indica numarul de octeti fata de sfarsitul fisierului
In parcurgerea inregistrarilor dintr-un fisier, in mod frecvent este necesara verificarea daca s-a ajuns sau nu la sfarsitul fisierului. In acest scop se va folosi functia: feof
int feof(FILE *stream);
Functia returneaza 1 daca s-a ajuns la sfarsitul fisierului, 0 daca nu s-a ajuns la sfarsitul fisierului si -1 in caz de eroare.
Alte functii de prelucrare a fisierelor
Functiile fgetc si fputc au prototipueile
int fgetc(FILE *pf);
int fputc(int c, FILE *pf);
Efectul: citirea/scrierea unui caracter din/in fisierul identificat prin pointerul pf. Functia fgetc - returneaza caracterul citit.
Exemplu: Programul citeste caracter cu caracter un fisier si afiseaza continutul acestuia pe ecran:
#include <stdio.h>
void main(void)
fclose(ptr);
Functiile fgets si fputs au prototipurile
int *fgets(char *sir, int n, FILE *stream);
int fputs(const char *sir, FILE *stream);
Efectul: citirea/scrierea unui sir de caractere din-in fisierul identificat prin pointerul pf.
Operatiile de inserare sau stergere a unei inregistrari din fisier sunt operatii complexe realizate in mai multe etape. Se folosesc functiile de biblioteca standard enumerate (deschidere fisier, creare fisier, scriere, citire, etc.) in implementarea operatiilor de inserare-stergere, insa nu exista functii standard corespunzatoare celor doua operatii ca atare.
Inserarea pe o pozitie k a unei noi inregistrari presupune parcurgerea urmatoarelor etape:
deschiderea fisierului initial in citire
crearea unu fisier auxiliar si deschiderea sa in modul scriere
parcurgerea secventiala fisierului initial si copierea inregistrarilor in fisierul auxiliar pana la inregistrarea k
scrierea noii inregistrari in fisierul auxiliar
continuarea parcurgerii fisierului initial si continuarea copierii inregistrarilor in fisierul auxiliar
redenumirea fisierului auxiliar cu numele fisierului initial
Stergerea inregistrarii k dintr-un fisier presupune de asemenea folosirea unui fisier auxiliar si parcurgerea etapelor urmatoare:
crearea fisierului auxiliar si deschidere sa in modul scriere
parcurgerea si copierea inregistrarilor fisierului initial in fisierul auxiliar pana la inregistrarea de pe pozitia k-1
citirea inregistrarii k fara a fi copiata in auxiliar
parcurgerea si copierea inregistrarilor fisierului initial in fisierul auxiliar de la inregistrarea k+1 pana la sfarsit.
O varianta de inserare sau stergere a unei inregistrari este aceea prin care se renunta la folosirea unui fisier auxiliar si se construieste o structura liniara de tip tablou in care sunt salvate temporar inregistrarile fisierului initial.
Afisarea continutului unui fisier. Etape:
Deschide fisierul
Cattimp nu s-a ajuns la sfarsitul fisierului
Citeste linia curenta
Afisare pe ecran linia citita
Sfcattimp
Inchidere fisier
Copierea continutului unui fisier (fis1.dat) intr-un alt fisier (fis2.dat). Etape:
Creeaza fișierul fis2.dat
Deschide fisierul fis1.dat
Cattimp (nu s-a ajuns la sfarsitul fisierului fis1.dat)
Citeste din fisierul fis1.dat
Scrie in fisierul fis2.dat
Sfcattimp
Inchidere fisierele.
Probleme
Sa se scrie un program C care citeste de la tastatura un vector de structuri Punct3D si le salveaza intr-un fisier puncte.dat.
Sa se scrie un program C care citeste din fisierul puncte.dat un vector de structuri Punct3D si afiseaza coordonatele punctelor pe ecran.
Scrieti un program care gestioneaza intr-un fisier structuri de tipul Persoana (CNP, nume, prenume, data nasterii, etc.). Operatiile evidentiate sunt cele de adaugare inregistrare, stergere inregistrare, cautare persoana dupa valoarea campului CNP, ordonarea alfabetica a persoanelor memorate in fisier.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 978
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved