13
Prelucrarea
fiierelor
Sumar
este o dat de un tip oarecare (predefinit sau definit de utilizator). La o citire, se transfer
ntr-o zon special, numit zon tampon (buffer), un numr de articole care se
1
presupune c au o lungime fix. n mod analog, la scriere se transfer din yona tampon un
numr de articole de lungime fix.
filebuf
ios
fstreambase
istream
ostream
iostream
ifstream
fstream
ofstream
La prelucrarea fiierelor se folosesc obiecte ale clasei filebuf care este o clas derivat a
clasei streambuf. Obiectele clasei filebuf sunt utilizate de clase specifice pentru operaii
cu fiiere i care aparin ierarhiei care are ca rdcin clasa ios.
Clasa fstreambase este o clas de baz pentru urmtoarele 3 clase:
ifstream
ofstream
fstream
ofstream
fstream
De aici rezult c pentru obiectele acestor clase se pot aplica funciile membru ale
claselor lor de baz, inclusiv suprancrcarea operatorilor se inserare i tergere.
out:
ate:
trunc:
nocreate:
noreplace:
- dac fiierul exist i este prezent opiunea out, atunci deschiderea este
admis numai dac se utilizeaz opiunea ate sau app;
Exemple:
1.ifstream fisier;
//se deschide fiierul fis.dat in citire
fisier.open(fis.dat,ios::nocreate);
4
}
else
{
cout<<eroare de dechidere \n;
}
Opiunea ios::in este implicit.
2. ofstream fis_iesire;
//se deschide fisierul factura.dat
fis_iesire.open(factura.dat);
if(!fis_iesire)
{ cout<<eroare de deschidere ;
}
3. ofstream fis;
//se deschide pentru adaugare fisierul binar stoc.dat
fis.open(stoc.dat, ios::app | ios::binary);
//se testeaza starea obiectului fis dupa deschidere
if(!fis)
{
cout<<eroare la deschidere \n;
}
else
{
//deschidere corecta
}
Cea de a doua posibilitate de a deschide un fiier este aceea de a folosi parametrii
corespunztori la instanierea obiectelor claselor ifstream, ofstream sau fstream. n acest
caz, constructorul apelat pentru instanierea obiectului apeleaz n mod automat funcia
open. Constructorii care deschid fiierele la instanierea obiectelor claselor amintite mai
sus, au aceiai parametri ca i funcia open.
nume_clasa(char *fisier, int mod, int protectie)
unde:
nume_clasa
}
else
{
cout<<eroare de dechidere \n;
}
2. ofstream fis_iesire(factura.dat);
if(!fis_iesire)
{ cout<<eroare de deschidere ;
}
3. ofstream fis(stoc.dat, ios::app | ios::binary);
//se testeaza starea obiectului fis dupa deschidere
if(!fis)
{
cout<<eroare la deschidere \n;
}
else
{
//deschidere corecta
}
Dup deschiderea unui fiier, se pot face prelucrri asupra fiierului respectiv.
unde
obiect
aceste clase.
Dup caracterele extrase din streamul curent se pstreaz caracterul NUL (\0).
Terminatorul definit de term nu se pstreaz n zona de memorie spre care pointeaz
zona.
Extragerea caracterului definit de term din streamul de intrare este posibil cu
ajutorul funciei getline. Aceasta are prototipul similar cu funcia get:
istream& getline(char *zona, int max, int term =\n);
Parametrii formali ai funciei getline au acelai sens ca i n cazul funciei get.
Extragerea binar a datelor din streamul curent se realizeaz folosind funcia read.
Aceasta are prototipul:
istream& read(unsigned char *zona, int n);
istream& read(signed char *zona, int n);
Funcia extrage n octei din streamul curent i i transfer n zona de memorie spre
care pointeaz zona.
Ieirea unui singur caracter se poate realiza cu ajutorul funciei put a clasei
ostream. Aceasta are prototipul:
ostream& put(char c);
Pentru a afia n octei, se poate utiliza funcia membru write a clasei ostream. Ea
are urmtoarele prototipuri:
ostream& write(const signed char *sir, int n);
ostream& write(const unsigned char *sir, int n);
Funcia write afieaz n caractere chiar dac printre cei n octei spre care
pointeaz sir se ntlnete caracterul NUL. Esena acestor funcii este faptul c, asupra lor
bii de format nu au nici un efect.
Ex.: fisier.seekp(n, beg(sau cur sau end)) unde n este deplasamentul n octei fa de
nceput, curent, respectiv sfrit.
Ptr. ifstream:
Ex.: fisier.seekg(n, beg(sau cur sau end)) unde n este deplasamentul n octei fa de
nceput, curent, respectiv sfrit.
Aplicaii
1. Se citeste un fisier TEXT ce contine numere intregi despartite prin spatiu sau ENTER.
Sa se afiseze minimul si maximul din acel fisier.
#include<iostream.h>
#include<fstream.h>
#include<values.h>
void main()
{
ifstream f("d:\\LaboratorOOP\\numar.txt");
/*
ifstream f;
f.open("numar.txt");
*/
if(!f)
//sau f=NULL
10
{
cout<<"Eroare la deschiderea fisierului!"<<endl;
return;
}
int x,max=-MAXINT,min=MAXINT;
f.seekg(0,ios::beg);
//ne pozitionam la inceputul fisierului
while(!f.eof())
{
f>>x;
if (max<x)
max=x;
else if (min>x)
min=x;
}
f.close();
cout<<"Maximul este: "<<max<<endl;
cout<<"Minimul este: "<<min<<endl;
}
2. Se citeste un fisier iext ce contine numere intregi despartite prin spatiu sau ENTER. Se
cere a se calcula si afisa pe ecran suma tuturor valorilor numerice din fisier si numarul de
elemente strict negative.
#include<iostream.h>
#include<fstream.h>
void main()
{
ifstream f("numar.txt");
i=0;
while(!f.eof())
{
f>>x[i];
if(x[i]<0)
n_neg++;
s+=x[i++];
}
f.close();
11
3. Se citeste un fisier TEXT ce contine numere intregi despartite prin spatiu sau ENTER.
Sa se afiseze minimul si maximul din acel fisier. Se va defini o clasa ptr numerele intregi
din fisier.
#include<iostream.h>
#include<fstream.h>
#include<values.h>
class numar
{
int n;
public:
int& retur();
friend istream& operator>>(istream&,numar&);
};
int& numar::retur()
{
return n;
}
istream& operator>>(istream& a,numar& b)
{
a>>b.n;
return a;
}
void main()
{
ifstream f("d:\\ LaboratorOOP\\numar.txt ");
if(!f)
{
cout<<"Eroare la deschiderea fisierului!"<<endl;
return;
}
numar x;
int max=-MAXINT;
int min=MAXINT;
f.seekg(0,ios::beg);
while(!f.eof())
{
f>>x;
if (max<x.retur())
max=x.retur();
else if (min>x.retur())
min=x.retur();
}
cout<<"Minimul este: "<<min<<endl;
12
4. Se citeste un sir de la tastatura pana la intalnirea caracterului "$". Dupa citire datele se
scriu intr-un fisier text si se preiau din fisierul respectiv si se face contorizarea fiecarei
vocale din fisier.
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
void main()
{
char c;
int a=0,e=0,i=0,o=0,u=0;
ofstream f("d:\\ LaboratorOOP\\numar.txt ");
if(!f)
{
cout<<"Eroare la deschidere."<<endl;
}
do{
c=getchar();
switch(c)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
}
if(c!='$')
f.put(c);
a++;
e++;
i++;
o++;
u++;
break;
break;
break;
break;
}while(c!='$');
f.close();
ofstream g("d:\\ LaboratorOOP\\numar.txt ");
if(!g)
{
cout<<"Eroare la deschidere fisierului de citire."<<endl;
}
g<<"Vocala a se gaseste de : "<<a<<" ori.\n";
g<<"Vocala e se gaseste de : "<<e<<" ori.\n";
g<<"Vocala i se gaseste de : "<<i<<" ori.\n";
g<<"Vocala o se gaseste de : "<<o<<" ori.\n";
g<<"Vocala u se gaseste de : "<<u<<" ori.\n";
g.close();
cout<<"Opratia de contorizare a vocalelor a reusit!"<<endl;
}
13
14
15
cin>>a;
cout<<"Intrarea este: ";
cout<<a; //afiseaza pe ecran
f<<a; /* scrie in fisier (este una dintre cele mai
interesante facilitati ale limbajului, adica, odata supraincarcat
oeratorul << ni se permite scrierea directa in fisier) */
break;
case '2':
char ch;
f.seekg(0,ios::beg);
while(!f.eof())
{
f.get(ch);
cout<<ch;
}
cout<<endl;
break;
case '3':
f.close();
}
} while(c!=3);
}
16
return;
}
in.read((unsigned char*) &v, sizeof v);
//aflati cati octeti au fost cititi
cout<<in.gcount()<<" octeti cititi.\n";
int max, min;
max=v[0];
min=v[0];
for(i=1;i<4;i++)
if(v[i]<min)
min=v[i];
else
if(v[i]>max) max=v[i];
for(i=0;i<4;i++)
cout<<v[i]<<" ";
cout<<endl<<"Maximul este:"<<max<<'\t'<<"minimul este: "<<min<<endl;
in.close();
}
17