Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


LUCRUL CU FISIERE

c



+ Font mai mare | - Font mai mic



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:



  1. Creare fisier
  2. Deschidere fisier
  3. Citire din fisier
  4. Adaugare - scriere in fisier
  5. Actualizare fisier
  6. Pozitionare in fisier
  7. Stergere fisier

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.

  1. Crearea unui fisier nou se realizeaza prin apelul functiei creat     care are prototipul:

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.

  1. Deschiderea unui fisier

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);

  1. Citirea din fisier

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.

  1. Inchiderea 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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1024
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved