Un fisier este o colectie de date de acelasi tip, memorate pe suport extern (hard, discheta, CD, etc).
Fisierele pot fi clasificate dupa continutul lor astfel:
Fisiere text: contin o secventa d 111i86b e caractere ASCII structurate pe linii;
Fisiere binare: contin o secventa d 111i86b e octeti, fara o structura predefinita.
Fisiere text in limbajul C++
Declararea fisierelor
Pentru ca un program sa poata citi informatii dintr-un fisier, respectiv sa scrie informatii intr-un fisier, trebuie sa asociem fisierul respectiv unui stream de intrare/iesire.
In fisierul antet fstream.h sunt declarate clasele:
ifstream - declarare stream de intrare (numai pentru operatii de citire);
ofstream - declarare stream de iesire (numai pentru operatii de scriere);
fstream - declarare stream de intrare/iesire (in care se pot realiza atat operatii de citire cat si operatii de scriere, in functie de modul specificat la deschidere).
Deschiderea fisierelor
Pentru a putea utiliza stream-ul declarat trebuie sa il deschidem. La deschidere, se asociaza stream-ului un fisier fizic(existent pe suport extern) si eventual, se precizeaza modul de deschidere, care determina operatiile permise cu fisierul respectiv.
Deschiderea se poate realiza in 2 moduri:
dupa declarare, prin apelul functiei membra open , precizand ca parametri un sir de caractere, care reprezinta specificatorul fisierului fizic si eventual modul de deschidere;
la declarare, specificand dupa numele stream-ului care se declara numai parametri corespunzatori functiei open incadrati in paranteze rotunde.
Exemplu:
ifstream f1;
f1.open ("date.in");
Acelasi efect se obtine astfel:
ifstream f1 ("date.in");
Citirea datelor dintr-un fisier
Dupa deschiderea fisierului ca fisier de intrare se pot realiza operatii de citire. In acest scop se poate utiliza operatorul de citire >> , sau pot fi utilizate functii-membru specifice. Una din particularitatile utilizarii acestui operator este faptul ca nu se pot citi caracterele albe. Daca intentionam sa citim toate caracterele se foloseste functia membru get (). Pentru citirea caracterelor se poate utiliza astfel:
ifstream f1 ("text.in");
char c;
f1.get(c);
Pentru citirea unui caracter de la tastatura se foloseste astfel:
cin.get(c);
Scrierea datelor intr-un fisier
Dupa deschiderea fisierului ca fisier de iesire, se pot realiza operatii de scriere utilizand operatorul de scriere <<.
ofstream fout ("date.out");
fout << "Salut";
Inchiderea unui fisier
Dupa realizarea tuturor operatiilor cu un fisier, acesta trebuie inchis. Inchiderea unui fisier se realizeaza prin apelarea functiei membre close ().
f1.close();
Operatia de inchidere este obligatorie mai ales pentru fisierele de iesire, pentru a nu se pierde informatii.
Fisiere text in limbajul C
Declararea fisierelor
In fisierul antet stdio.h sunt declarate si functiile, constantele, tipurile de date si variabilele globale cu ajutorul carora pot fi prelucrate informatiile continute in fisiere.
Pentru a utiliza intr-un program operatii de intrare/iesire folosind fisiere trebuie sa declaram una sau mai multe variabile de tip FILE*.
Declaratia unui fisier se face astfel:
FILE * fisier;
Deschiderea fisierelor
Pentru a avea acces la informatiile din fisier trebuie sa fie cunoscut fisierul fizic de pe suport ca si modul in care vor fi preluate informatiile din fisier. Acest lucru se realizeaza cu functia fopen.
fisier = fopen (const char *nume, const char *mod)
nume este o constanta de tip sir de caractere care reprezinta specificatorul fisieului fizic pe suport, iar mod este o constanta sir de caractere care indica modul in care vor fi accesate informatiile din fisier.
FILE *f1, *f2, *f3;
f1 = fopen("date.in","r"); //deschis fiserul de intrare (r) f1
f2 = fopen("date.out","w"); //deschis fiserul de iesire (w) f2
f3 = fopen("date.txt","a"); //deschis fiserul f3 pentru adaugare //informatii (a - append)
Declararea si deschiderea unui fisier se pot face si simultan:
FILE *f1 = fopen ("date.in", "r")
Citirea datelor dintr-un fisier
Dupa deschiderea fisierului ca fisier de intrare se pot realiza operatii de citire. Pentru asta se utilizeaza functia fscan.
int fscan (fisier, format, adresa-var1, , adresa-varn);
Scrierea datelor intr-un fisier
Dupa deschiderea fisierului ca fisie de iesire, se pot realiza operatii de scriere utilizand functia fprintf().
int fprintf (fisier, format, expr1, , exprn);
Inchiderea fisierelor
Dupa terminarea tuturor operatiilor care implica lucrul cu fisiere, acestea trebuie inchise. Functia care se foloseste este fclose.
fclose (fisier);
Functii care lucreaza cu fisiere:
- fopen(nume_fisier, mod) - deschidere un fisier si returneaza pointerul de fisier asociat fisierului de pe disc. parametrul mod indica modul in care va fi deschis fisierul:
Mod Semnificatie
r deschide un fisier text pentru a fi citit
w creeaza un fisier text pentru a fi scris
a adauga intr-un fisier de tip text
rb deschide un fisier binar pentru a fi citit
wb creeaza un fisier binar pentru a fi scris
ab adauga intr-un fisier de tip binar
r+ deschide un fisier text pentru a fi citit/scris
w+ creeaza un fisier text pentru a fi citit/scris
a+ adauga in sau creeaza un fisier text pentru a fi citit/scris
r+b deschide un fisier binar pentru a fi citit/scris
w+b creeaza un fisier binar pentru a fi citit/scris
a+b adauga in sau creeaza un fisier binar pentru a fi citit/scris
- fclose(fp) inchiderea unui fisier;
- fputc(ch, fp) - scrie caractere intr-un fisier deschis anterior pentru scriere;
- fgetc(ch, fp) - citeste caractere dintr-un fisier deschis anterior cu fopen() in modul citire, returnand EOF cand s-a ajuns la sfarsitul fisierului.
Pentru a putea citi pana la sfarsitul unui.fisier de tip text, puteti folosi urmatorul cod:
do
Programul urmator citeste din fisierul de intrare nr.in un numar natural n cu prins intre 0 si 100 si apoi n valori naturale si afiseaza in fisierul de iesire nr.out numerele citite descompuse in factori primi, pe fiecare linie fiind scris cate un numar urmat de perechi de forma (d,p), indicand divizorul si puterea lui.
//TEST 3
#include <stdio.h>
int main ()
FILE * fout = fopen ('nr. out', 'w');
er = fscanf (fin, '%d', &n); //se citesc date din fisierul fin
if (! er || n>100 ||n<0)
for (i=0; i<n; i++) //se citesc cele n valori
fprintf (fout, '%10lu', x);
d=2;
while (x>1)
if (p) fprintf (fout, '(%d, %d)', d, p);
d++;
}
fprintf (fout, 'n');
}
fclose (fout);
return 0;
Programul urmator creaza o copie a fisierului intrare.txt cu numele iesire.txt:
//TEST 4
#include <stdio.h>
int main ()
if (!(fisout = fopen ('iesire.txt', 'w')));
while (!feof (fisin))
if (fscanf (fisin, '%c', &x) !=EOF)
fprintf (fisout, '%c', x);
fclose (fisin);
fclose (fisout);
return 0;
//TEST 5
#include <stdio.h>
void main()
while (ch!='s');
fclose(fp);}
-feof( fp ) - stabileste cand a fost atins sfarsitul de fisier
- fputs( sir_caract, fp) - scrie un sir de caractere intr-un fisier, fara a memora caracterul de linie noua n;
- fgets( sir_caract, lung_sir, fp) - citeste un sir de caractere intr-un fisier, pana este intalnit caracterul de linie noua n, care este inclus in sir, sau pana au fost citite lung_sir-1 caractere (sirul rezultat va fi terminat cu ' 0 ';
- rewind(fp) - readuce indicatorul de pozitie al fisierului la inceput, indicatorul fiind specificat ca argument;
- remove( nume_fisier ) - stergerea unui fisier.; returneaza 0 daca stergerea s-a facut cu succes.
- fwrite( buffer, numar_octeti, numara, fp) - scrierea blocurilor de orice tip de date: buffer este un pointer catre informatiile care vor fi scrise
- fread( buffer, numar_octeti, numara, fp - citirea blocurilor de orice tip de date: buffer este un pointer catre o regiune de memorie care va primi datele de la fisier.
Valoarea numara determina numarul de elemente scrise sau citite, fiecare avand un numar de octeti egal cu numar_octeti.
//TEST 6
#include <stdio.h>
#include <stdlib.h>
void main()
Citirea si scrierea structurilor se poate face astfel:
struct tip_struct cust;
fwrite(&cust, sizeof(struct tip_struct), 1, fp);
- fseek(fp, num_octeti, SEEK_SET) - controleaza indicatorul de pozitie al fisierului, num_octeti fiind numarul de octeti de la inceputul fisirerului care va deveni noua pozitie curenta.
Puteti folosi fseek() pentru a cauta multipli de orice tip de date prin simpla inmultire a marimii datei cu numarul de elemente pe care il doriti.
fseek(fp, 9*sizeof(struct tip_struct), SEEK_SET) - cauta a zecea inregistrare din fisier
|