Sunteți pe pagina 1din 4

Informatica clasa a X-a

Exploatarea fiierelor TEXT


1. Noiunea de fiier
Prin fiier se nelege o structur de date pstrat n memoria extern a calculatorului , cu componente
numite nregistrri, ce pot avea o dimensiune fix sau variabil, cel de-al doilea caz impunnd existena unor
marcaje speciale numite separatori de nregistrri. Fiierele pot fi clasificate dup mai multe criterii. Din punct
de vedere al accesului la componente se mpart n:
- fiere cu acces secvenial ale cror nregistrri pot fi prelucrate numai n ordinea n care sunt stocate n
fiier
- fiiere cu acces direct ale cror componente pot fi prelucrate n orice ordine. n cazul n care prelucrarea
nu se face secvenial, nainte de fiecare operaie de citire/scriere trebuie furnizat informaia necesar
selectrii componentei ce urmeaz a fi prelucrat
Din punct de vedere al coninutului, fiierele se mpart n dou categorii:
- fiiere text care conin numai caractere structurate pe linii de lungime variabil
- fiiere binare n care informaia este vzut ca o colecie de octei
Fiierul text are urmtoarele caracteristici:
Este o colecie de linii de text. Liniile de text au lungimi diferite. Fiecare linie de text reprezint o
nregistrare. Aadar, fiierul text este un fiier cu nregistrri de lungime variabil.
n cadrul unei nregistrri (linie de text), entitatea prelucrat este octetul. Coninutul unui octet este
interpretat ca fiind codul ASCII al unui caracter.
Liniile de text sunt separate de marcajul newline (\n) care se genereaz la apsarea tastei Enter.
Fiierul text se termin prin marcajul eof (end of file) care se genereaz prin apsarea tastelor Ctrl+Z
i care are codul ASCII 26. Marcajele newline i eof sunt inserate automat n fiier la crearea lui prin
operaia de scriere.
Entitatea prelucrat ntr-o operaie de citire sau de scriere este octetul.
Selectarea octetului asupra cruia acioneaz operaia de citire sau de scriere se face prin mecanismul
pointerului ctre octet (pointer de fiier=indicatorul de poziie curent), care este o variabil de
memorie n care se pstreaz adresa octetului curent. Putem s ne nchipuim acest pointer ca pe un
cursor care se deplaseaz cu o poziie dup fiecare operaie de citire sau scriere.
Fiierele text pot fi citite i modificate cu orice editor de text.

2. Prelucrarea fiierelor
Lucrul cu fisiere se face prin intermediul clasei ifstream pentru citire respectiv ofstream pentru scriere. Pentru
a le utiliza, aplicatiile trebuie sa includa biblioteca de funcii <fstream.h>.
Prelucrarea unui fiier se face prin mai multe operaii: declarare, deschidere (pentru citire sau scriere), citire,
scriere, nchidere. La nivel de program fiierul este recunoscut printr-o variabil asociat, numit identificator
de fiier (id_f).

2.1. Declararea fiierelor


Se face utiliznd sintaxa: ifstream id_f ; ofstream id_f ; sau se include n operaiile de deschidere a fiierelor.

2.2. Deschiderea fiierelor pentru citire/scriere


Deschiderea fiierului pentru citire se face cu:
fstream id_f( [cale\\]nume_fisier, ios::in); // ios::input permite deschiderea unui fiier pentru citire
sau
ifstream id_f(nume_fisier);
Deschiderea fiierului pentru scriere se face cu:
fstream id_f( [cale\\]nume_fisier, mod);
sau
ofstream id_f(nume_fisier); //se poate specifica, opional, modul de deschidere.
Modul de deschidere este un parametru format din urmtoarele combinaii:
(output ) Deschidere fiier pentru operaii de scriere
ios::out
(at end) Seteaz poziia iniial la sfritul fiierului. Dac fiierul nu exist se creaz.
ios::ate

Informatica clasa a X-a

ios::app

(append) Deschidere pentru adugare la sfrit de fiier; fiierul trebuie s existe.


(truncate) Dac fiierul deschis pentru operaii de scriere exist deja, coninutul lui anterior este
ios::trunc
ters i nlocuit cu cel nou.
ios::nocreate Fiierul deschis trebuie s existe (el nu poate fi creat).
ios::noreplace Fiierul este deschis, iar coninutul lui nu poate fi nlocuit.
Citirea din fiiere text se face astfel:
id_f>>v1[>>v2>>...>>vn];
unde v1, v2,....vn sunt identificatori de variabile elementare de orice tip.
Pentru citirea unui caracter din fiier se folosete:
id_f.get(c);
unde c este o variabil de tip caracter n care se va memora caracterul citit din fiier.
Pentru citirea unui ir de caractere de pe o linie din fiier se folosete:
id_f.getline(s, nr);
unde s este o variabil de tip tablou n care se vor memora caracterele citite din
fiier, iar nr este lungimea irului de caractere.
Scrierea n fiiere text se face astfel:
id_f<<v1[<<v2<<...<<vn];
unde v1, v2,....vn sunt identificatori de variabile elementare de orice tip
sau de constante.
Pentru scrierea unui caracter ntr-un fiier se poate folosi i sintaxa:
id_f.put(c);
unde c este o variabil de tip caracter al crei coninut se va scrie n fiier.

2.3. nchiderea unui fiier


nchiderea fiierelor este esenial i se face cu sintaxa:
id_f.close();

2.4. Funcia de verificare a sfritului unui fiier


Pentru a verifica dac poziia curent de citire/scriere a ajuns la sfritul unui fiier se folosete funcia
id_f.eof(),care ntoarce valoarea 0 dac poziia curent nu este la sfritul fiierului i o valoare diferit de
0 dac poziia actual indic sfritul de fiier.

3. Exemple de prelucrare a fiierelor


Exemplul 1: Copierea unui fiier n alt fiier caracter cu caracter.
#include<fstream.h>
#include<stdlib.h>
void main()
{
char c ;
ifstream f(in.txt);
ofstream g(out.txt);
//se declara doua variabile fisier
// se copie cte un caracter din sursa si se scrie
// in destinatie
f.get(c);
while(!f.eof())
{ g.put(c); f.get(c);}
f.close(); g.close(); // se nchid fiierele deschise
}
Exemplul 2: Se numr cte caractere de fiecare tip (litere, cifre i neafiabile) sunt ntr-un fiier text.
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
void main()
{
int l,c,g;
char ch;
l=c=g=0;

Informatica clasa a X-a

ifstream f(in.txt); //se declara o variabil fisier


do{
f.get(ch); //citete un caracter din fiier
if(isalpha(ch)) l++;
// caracterul este o litera
if(isdigit(ch)) c++;
// caracterul este o cifra
if(!isprint(ch)) g++;
// caracterul nu este afisabil
}while(!f.eof()); //pn se ntlnete EOF
cout<<\n numarul de litere este <<l;
cout<<\n numarul de cifre este <<c;
cout<<\n numarul de caractere neafisabil este <<g;
f.close();
}
Exemplul 3:

Copierea unui fiier text n altul, linie cu linie.

#include<fstream.h>
#include<stdlib.h>
void main()
{
char linie[80];
ifstream f("in.txt");
ofstream g("out.txt"); //se declara o variabil fisier
while(!f.eof())
{
f.getline(linie,80); //citete o linie din f
g<<linie<<endl;
//scrie linia n g
}
f.close();
g.close();
}
Exemplul 4: Citirea unui ir de n numere ntregi din fiier (n cunoscut) i afiarea lui pe ecran. Pe prima linie
din fiier este memorat valoarea lui n, iar pe urmtoarea linie sunt memorate cele n valori separate prin spaiu.
#include<fstream.h>
#include<stdlib.h>
void main()
{
int n, x,i;
ifstream f("in.txt");
f>>n; //citesc n din prima linie a fisierului
for(i=1;i<=n;i++)
{
f>>x;
// citesc pe rnd fiecare numr din fiier
cout<<x<<" ";
// afiez pe ecran numerele din fiier separate prin
spaii
}
f.close();
}
Exemplul 5: Citirea unui vector de n numere ntregi din fiier (n100) i afiarea lui pe ecran. Pe prima linie
din fiier este memorat valoarea lui n, iar pe urmtoarea linie sunt memorate cele n valori separate prin spaiu.
#include<fstream.h>
#include<stdlib.h>
void main()
{
int n, x[50],i;
ifstream f("in.txt");
f>>n; //citesc n din prima linie a fisierului
for(i=1;i<=n;i++)
{
f>>x[i];
// citesc pe rnd fiecare element al vectorului din fiier
cout<<x[i]<<" ";
// afiez pe ecran elementele vectorului separate

Informatica clasa a X-a

prin spaii
}
f.close();
}
Exemplul 6: Citirea unei matrici a cu m linii i n coloane din fiier (m,n20). Pe prima linie din fiier se gsesc
valorile m i n separate prin spaiu. Pe urmtoarele m linii se gsesc cte n valori separate prin spaiu
reprezentnd elementele matricii.
#include<fstream.h>
#include<stdlib.h>
void main()
{
int m,n,x[10][10],i,j;
ifstream f("in.txt");
f>>m>>n;
//citesc m i n din prima linie a fiierului
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
f>>x[i][j]; //citesc din fiier elementele fiecrei linii din
matrice
cout<<x[i][j]<<" "; //afiez elementele fiecrei linii din
matrice separate prin spaii
}
cout<<endl; //trec la linia urmtoare
}
f.close();
}
Exemplul 7: Scrierea elementelor unei matrici ptratice nxn de numere ntregi ntr-un fiier text, fiecare linie
din matrice se va scrie pe o linie din fiier, valorile fiind separate prin spaiu.
#include<fstream.h>
#include<stdlib.h>
void main()
{
int m,n,x[10][10],i,j;
ifstream f("in.txt");
ofstream g("out.txt");
f>>m>>n;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
f>>x[i][j];
g<<x[i][j]<<" "; // scriu n fiier elementele fiecrei linii
din matrice separate prin spaii
}
g<<endl;
}
f.close();
}
Exemplul 8:
Se calculeaz produsul primelor n numere naturale. Numrul natural nenul n se citete din
fiierul date.in, iar produsul se va afia n fiierul date.out.
#include<fstream.h>
#include<stdlib.h>
void main()
{
unsigned n,i,p=1;
ifstream f("in.txt");
ofstream g("out.txt");
f>>n;
for(i=1;i<=n;i++)
p*=i;
g<<"produsul primelor "<<n<<" numere naturale este "<<p;
f.close(); }

S-ar putea să vă placă și