Prelucrarea fisierelor in limbajul C++
Fisiere text
Fisiere binare
Limbajul C++ defineste clasele istream si ostream pentru operatii de intrare si iesire cu fisierele standard, tastatura si ecranul. Obiectul cin este o instanta a clasei istream, iar cout o instanta a clasei ostream. Pentru lucrul cu fisiere de date limbajul C++ defineste urmatoarele clase
Aceste clase mostenesc din clasele istream si ostream. Definitiile acestor clase se gasesc in biblioteca <fstream>. O serie de constante utilizate de aceste clase sunt definite in clasa ios. Pentru prelucrarea unui fisier se creaza un obiect instanta a uneia din clasele de mai sus care este denumit stream.
Clasele definesc un constructor fara parametri.
Functiile membre importante ale claselor sunt
open(char * filename, int mode);
asociaza obiectul cu fisierul. Parametrul filename este un sir de caractere cu numele fisierului. Al doilea parametru este optional si da modul de deschidere. El poate avea valorile
ios::in - deschidere in citire
ios::out - deschidere in scriere
ios::binary - fisier binary
Acesti parametri se pot combina folosind operatorul | . De exemplu, pentru un fisier binar deschis in scriere vom avea
ios::binary | ios:out
iar pentru deschiderea unui fisier binar in citire
ios::binary | ios::in
Acest al doilea parametru este optional pentru obiecte de tipul ifstream si ofstream care sunt automat deschise in citire si respectiv scriere.
void close();
inchide un fisier.
bool eof();
are valoarea adevarat daca s-a detectat sfarsitul fisierului
bool is_open();
are valoarea adevarat daca fisierul este deschis.
1. Fisiere text
Exista doua tipuri de operatii intrare/ iesire pentru fisiere tip text
Functii intrare / iesire cu format
Fisierele tip text se prelucreaza in acelasi mod ca fisierele standard de intrare si iesire, cin si cout. Operatorii de citire si scriere sunt >> si <<.
Functii intrare / iesire tip caracter
Clasele istream si ifstream au urmatoarele functii membre pentru citirea caracterelor. Functia
get(char&);
citeste un character.
Functia
getline(char * bloc, int size);
citeste cel mult size caractere in vectorul bloc.
Functia
getline(char * bloc, int size, char car);
citeste cel mult size caractere in vectorul bloc sau pana la intalnirea caracterului car.
Clasele ostream si ofstream au functia membra
put(char);
ce scrie un caracter.
Probleme rezolvate
Problema 1. Sa se scrie un program care sa calculeze valoarea unei expresii intr-un anumit numar de puncte. Rezultatele calculelor se vor scrie intr-un fisier text dupa care acest fisier va fi citit si afisat pe ecran. Programul de rezolvare a problemei este cel de mai jos.
# include <fstream>
# include <iostream>
# include <cmath>
using namespace std;
int main()
// calculeaza expresia
int i;
double x, e;
for(i = 0; i < 11; i++)
fil1.close();
// citeste fisierul creat si afisaza rezulatele
ifstream fil2;
fil2.open(filename);
if(!fil2.is_open())
cout << 'x' << 't' << 'e' << endl;
fil2 >> x >> e;
while(!fil2.eof())
fil2.close();
return 0;
Rezultatele rularii programului sunt cele de mai jos.
Problema 2. Sa se faca un program care sa copieze un fisier text. Programul va citi de la tastatura numele fisierului initial si al noului fisier. Copierea se va face citind cate un octet din primul fisier si scriindu-l in al doilea fisier. Se vor numara si afisa octetii cititi. Programul de rezolvare a problemei este cel de mai jos.
# include <iostream>
# include <fstream>
using namespace std;
int main()
cout << endl << "Introduceti numele noului fisier" << endl;
cin >> filename;
ofstream filb(filename);
if(!filb.is_open())
char car;
int nl = 0;
fila.get(car);
while(!fila.eof())
fila.close();
filb.close();
cout << 'lungimea fisierului ' << nl << ' caractere' << endl;
return 0; }
Rezultatele rularii programului pentru un exemplu concret sunt cele de mai jos.
2. Fisiere binare
Scrierea si citirea datelor din fisierele binare se face cu functiile
write(char * block, int size);
read(char * block, int size);
Primul parametru este adresa unui vector de caractere de unde sunt scrise datele sau unde sunt citite datele. Al doilea parametru da numarul de caractere de citit sau de scris.
Fisierele au indicatori interni care dau adresa urmatorului octet de citit sau de scris. Voloarea acestor indicatori este data de functiile
tellg();
pentru indicatorul urmatorului octet de citit.
tellp();
pentru indicatorul urmatorului octet de scris.
Indicatorii de pozitie sunt modificati de functiile
seekg(int offset, int direction);
pentru indicatorul de citire si respectiv
seekp(int offset, int direction);
pentru indicatorul de scriere. Parametrul offset da valoarea cu care se modifica indicatorul. Parametrul direction are valorile
ios::beg - relativa la inceputul fisierului
ios::end - relativa la sfarsitul fisierului
ios::cur - relativa la pozitia curenta
Probleme rezolvate
Problema 1. Se va crea un fisier binar cu 10 blocuri cu siruri de 10 caractere. Se va citi apoi fisierul si se va afisa pe ecran. Programul de rezolvare a problemei este cel de mai jos.
# include <iostream>
# include <fstream>
using namespace std;
int main()
int i, j;
for(i = 0; i < 10; i++)
fila.close();
ifstream filb;
// citeste si afisaza fisierul
filb.open(filename, ios::binary / ios::in);
if(!filb.is_open())
filb.read(x, 11);
while(!filb.eof())
filb.close();
return 0;}
Rezultatele rularii programului sunt cele de mai jos.
Probleme propuse
Problema 1. Sa se faca un program care sa calculeze dimensiunea in octeti a unui fisier text. Lungimea se va calcula citind cate un octet din fisier.
Problema 2. Sa se faca un program care sa calculeze numarul de linii dintr-un fisier text. Numarul de linii se va calcula citind toate liniile fisierului.
|