Sunteți pe pagina 1din 24

TEMA PROIECTULUI:

Fiiere text n C++

CUPRINS
1. Noiuni teoretice
2. Aplicaii practice

3. Bibliografie

1.Noiuni teoretice
Un fiier este o colecie de date de acelai tip, memorate pe suport extern (hard-disc,
dischet, CD, etc).
Avantajele utilizrii fiierelor sunt o consecin a proprietilor memoriilor externe.
Fiierele permit memorarea unui volum mare de date persistente (care nu se pierd la ncheierea
execuiei programului sau la nchiderea calculatorului). Pn acum am lucrat numai cu date citite
de la tastatur, memorate n variabile simple. Pe parcursul execuiei unui program, se aloc
memorie n RAM pentru variabilele utilizate n programul respectiv. Memoria alocat se
elibereaz fie pe parcursul execuiei programului, fie la terminarea execuiei acestuia. n orice
caz, dup terminarea programului, valorile variabilelor s-au pierdut, deoarece zona de memorie
n care au fost memorate s-a eliberat i dac doream s executm nc o dat programul cu
aceleai date de intrare, trebuia s le introducem din nou de la tastatur. Chiar i pentru programe
cu un volum mic de date de intrare, aa cum am elaborat noi pn acum, acest aspect reprezint
un inconvenient. Dar imaginai-v ce s-ar ntmpla la o firm, care, de exemplu, la fiecare rulare
a programului de salarii ar trebui s introduc toate datele despre angajaii firmei sau la o
bibliotec, la care, de exemplu, orice cerere de mprumut s-ar solda cu introducerea tuturor
crilor existente n bibliotec! Exemplele pot continua, dar ideea principal rmne c n orice
situaie practic fiierele sunt indispensabile.
Fiierele pot fi clasificate dup coninutul lor astfel:
fiiere text conin o secven de caractere ASCII, structurate pe linii;
fiiere binare conin o secven de octei, fr o structur predefinit.
Noi vom studia modul de utilizare a fiierelor text.

Fiiere text in limbajul C++


Declararea fiierelor
Operaiile de intrare/ieire in limbajul C++ au utilizat pn acum stream-urile cin si cout ,
care erau automat asociate tastaturii,respectiv ecranului.Pentru ca un program s poat citi
nformaii dintr-un fiier,respectiv s scrie informaii ntr-un fiier,trebuie s asociem fiierul
respectiv unui stream de intrare/ieire.
n fiierul antet fst.ream sunt declarate clasele ifstream, ofstream i fstream. Pentru a utiliza ntrun program operaii de intrare/ieire folosind fiiere trebuie s declarm variabile de tipurile
ifstream , ofstream sau fstream .
Mai exact :
ifstream declare stream de intrare (numai pentru operaii de citire);
ofstream declare stream de ieire (numai pentru operaii de scriere);
fstream declare stream de intrare/ieire (in care se pot realiza att operaii de citire, ct
si operaii de scriere, n functie de modul de specificat la deschidere).
Exemple
ifstream f1; //am declarat un stream de intrare denumit f1

ofstream f2; //am declarat un stream de ieire denumit f2


fstream f3; //am declarat un stream numit f3.

Deschiderea fiierelor
Pentru a utliza stream-ul declarat trebuie s l deschidem.La deschidere se asociaz
stream-ului un fiier fizic (existent pe suport extern) i,eventual,se precizeaz modul de
deschidere, care determin operaiile permise cu fiierul respectiv.Deschiderea se poate realiza in
dou moduri :
dup declarare,prin apelul funciei membru open , preciznd ca parametri un ir de
caractere,care reprezint specificatorul fiierului fizic,conform sintaxei sistemului de
operare utilizat i (eventual) modul de deschidere;
la declare, specificnd dup numele stream-ului care se declar numai parametrii
corespunztori funciei open, ncadrai ntre paranteze rotunde.
La deschidere este obligatoriu s specificm modul de deschidere dac fiierul este
declarat de tip fstream. Pentrul tipul ifstream se utilizeaz implicit modul ios : : in , iar
pentru tipul ofstream se utilizeaz implicit modul ios : : out .
Exemplu 1
ifstream f1
f1.opren(date.in);
Am declarat un stream de intrare denumit f1, apoi l-am deschis cu ajutorul funciei open ,
asociindu-l fiierului date.in . Deoarece nu am precizat discul logic pe care se afl acest fiier sau
calea ctre directorul n care se afl fiierul , se deduce c fiierul se afl pe hard-disc n directoul
curent. Acelai efect l-am fi obinut prin deschiderea fiierului la declarare,astfel :
ifstream f1(date.in);
Exemplu 3
fstream f3
f3.opren(nr.in, ios : :in);
Am declarat un stream denumit f3, pe care la deschidere l-am asociat fiierului nr.in .
Deoarece tipul fstream nu are asociat un mod de deschidere implicit,a fost necesar s precizm
modul de deschidere.n acest caz modul de deschidere este ios : :in , ceea ce nseamn c fi ierul
a fost deschis ca fiier de intrare (numai pentru operaii de citire).
Exemplul 4
fstream f4;
f4.open("nr.out", ios::out);
Am declarat un stream denumit f4, pe care la deschidere l-am asociat fiierului nr.out.
Modul de deschidere specificat este ios::out, ceea ce semnific deschiderea fiierului ca fiier de
ieire (se creeaz un fiier vid cu numele specificat, n care se vor realiza doar opera ii de
scriere).

Citirea datelor dintr-un fiier

Dup deschiderea fiierului ca fiier de intrare se pot realiza operaii de citire. n acest
scop se poate utiliza operatorul de citire >>, sau pot fi utilizate funcii membru specifice.
Una dintre particularitile citirii cu operatorul >> este faptul c ignorcaracterele albe.
Prin urmare dac intenionm s citim toate caracterele din fiier (inclusiv spaiu, tab, enter)
acest mod de citire este inadecvat.
n acest scop putem utiliza funcia membru get(). Funcia get() are mai multe forme de
apel. De exemplu, pentru citirea caracterelor (char sau unsigned char) se poate utiliza astfel:
ifstream f1("text.in");
char c;
f1.get(c);
Am citit primul caracter din fiier, indiferent dac este sau nu caracter alb.

Scrierea datelor ntr-un fiier


Dup deschiderea fiierului ca fiier de ieire, se pot realiza operaii de scriere utiliznd
operatorul de scriere <<.
Exemplu
ofstream fout("date.out");
fout<<"Salut";

Operaii de test
Detectarea sfritului de fiier
n multe aplicaii este necesar s citim toate datele existente ntr-un fiier, fr s avem
informaii prealabile despre numrul acestora.
La deschiderea unui fiier se creeaz un pointer de fiier, care indic poziia curent n
stream. Orice operaie de citire determin deplasarea pointerului de citire stream-ul de intrare,
respectiv orice operaie de scriere determin deplasarea pointerului de scriere n stream-ul de
ieire.
Pentru a testa dac pointerul de fiier a ajuns la sfritul fiierului putem utiliza func ia
membru eof(). Funcia eof() returneaz valoarea 0 dac nu am ajuns la sfritul fiierului,
respectiv o valoare diferit de 0 dac am ajuns la sfrit.
Exemplu
Vom citi i vom numra toate caracterele existente ntr-un fiier, pn la sfritul acestuia.
ifstream fin("text.in");
char c;
long int nr=0;
while (!fin.eof()) {fin.get(c); nr++;}
cout<<"Fiierul contine "<<nr<<" caractere\n";
Funcia membru get() returneaz pointerul de fiier (poziia curent n stream). Prin
urmare secvena de program ar putea fi rescris i astfel:
ifstream fin("text.in");
char c;
long int nr=0;

while (fin.get(c)) nr++;


cout<<"Fiierul contine "<<nr<<" caractere\n";

Testarea reuitei unei operaii de intrare/ieire


n aplicaiile didactice de cele mai multe ori presupunem c datele de intrare sunt corecte.
n condiii practice ns trebuie s verificm reuita oricrei operaii de intrare/ieire i mai mult,
s verificm i corectitudinea datelor citite.
Pentru a testa reuita unei operaii de intrare/ieire se poate utiliza de exemplu func ia
membru good(). Funcia good() returneaz o valoare diferit de 0 dac operaia precedent de
intrare/ieire s-au efectuat cu succes i 0 n caz contrar.
Exist i alte funcii de test asemntoare: bad() (care returneaz o valoare diferit de 0
dac s-a efectuat o operaie incorect) sau fail() (care returneaz o valoare diferit de 0 dac a
aprut o eroare n operaiile de intrare/ieire pn n acel moment).

nchiderea unui fiier


Dup realizarea tuturor operaiilor cu un fiier, acesta trebuie nchis. nchiderea unui fiier
se realizeaz prin apelarea funciei membru close().
Exemplu
f1.close();
Operaia de nchidere este obligatorie, n special pentru fiierele de ieire. n cazul n care
nu nchidei fiierul de ieire, exist mari anse s pierdei informaii!

Declararea fiierelor
Operaiile de intrare/ieire n limbajul C au fost realizate pn acum utiliznd
instruciunile scanf() si printf() , care implicit preiau nformaii de la tastatur i ,respective, le
transmit spre ecran.
Pentru ca un program s poat prelucra nformaii dintr-un fiier,acesta trebuie
declarant,indicndu-se numele lui precum i operaiile premise asupra coninutului fiierului
respective.
n fiierul antet <cstdio> sunt declarate,printre altele i funciile, constantele ,tipurile de
date i variabilele globale cu ajutorul crora pot fi de intrare/ieire folosind fiiere trebuie s
declarm unu sau mai multe variabile de tip FILE * . Declaraia unui fiier se face astfel :
FILE * fiier;

Deschiderea fiirelor
Desigur,pentru a avea acces la informaiile din fiier trebuie s fie cunoscut fiierul fizic
de pe support(specificatorul de fiier conform sintaxei sistemului de operare utilizat), ca i modul
n care vor fi prelucrate nformaiile din fiier.Acest lucru se realizeaz utiliznd funcia fopen.
Exemple

FILE *f1, *f2, *f3; //am declarat trei fiiere f1, f2, f3
f1 = fopen("date.in", "r"); //am deschis fiierul de intrare (r - read) f1
f2 = fopen("date.out", "w"); //am deschis fiierul de ieire (w - write) f2
Declararea i deschiderea unui fiier se pot face i simultan:
Exemplu 1
FILE *f1 = fopen("date.in", "r");
Am declarat fiierul de intrare denumit f1 , apoi l-am deschis cu ajutorul funciei fopen ,
asociindu-l fiierului date.in . Deoarece n toate exemplele anterioare nu am precizat discul logic
pe care se afl fiierele sau calea ctre directorul n care se afl acestea , se deduce c fi ierele se
afl pe hard-disc n directorul curent.
Exemplu 2
FILE *f2;
f2 = fopen("date.out", "w");
Am declarat un fiier de iesire , denumit f2, pe care l-am asociat fiierlui fizic date.out n
directorul current.
Observaie
Dac, dup operaia de deschidere a fiierlui , variabila corespunztoare are valoare
NULL, deduce c operaia de deschidere a euat (de exemplu , dac dorim s deschidem un fiier
de intrare care nu exist). Este indicat s testm succesul operaiei de deschidere nainte de a
efectua orice alt operaie cu fiierul.
Exemplu 3
#include <cstdio>
using namespace std;
int main()
{ FILE *numef;
if (!(numef = fopen("nr.in", "r")))
printf("EROARE la deschidere\n");
else printf("Deschidere corecta a fisierului\n");
return 0; }
Testarea erorii la deschiderea fiierului se poate face i astfel:
if ((numef = fopen("nr.in", "r")) == NULL)

Citirea datelor dintr-un fiier


Dup deschiderea fiierului de intrare se pot realiza operaii de citire.n acest scop se
utilizeaz funcia fscanf.
int fscanf(fisier,format,adr_var1,.,adr_varn);
Prototipul funiei fscabf() este asemntor cu prototipul funiei scanf().Funia fscanf() are
in plus , ca prim parametru, fiierul din care se face citirea.n rest,semnificaia parametrilor,
rezultatului i efectul funciei sunt acelaii ca n cazul funciei scanf().

Citirea datelor cu format specificat

Funcia scanf() permite citirea datelor sub controlul unui format specificat.Aceast
funcie declarat n fiierul antet cstdio i are urmtorul format :
int scanf(format,adc_var1,adc_var2,.,adc_varn);
Efect
Funia parcurge succeiunea de caractere ntrodus de la tastatur i extrage valoriile care
trebuie citite conform formatului specificat.Valorile citite sunt memorate n ordine n variabile
specificate prin adresa lor n lista de parametri ai funiei scanf().Adresa unei variabile se obine
cu ajutorul operatorului de refereniere (&).Acest operator este unar(are un singur operand care
trebuie s fie o variabil) : &variabil .
Funia scarf() returneaz numrul de valori citite corect.n cazul unei erori,citirea se
ntrerupe n poziia n care a fost ntlnit eroarea.
Obervaie
Dac n lista de parametri ai funciei scanf() specificai doar numele variabilei, nu adresa
acesteia, funcia va citi valoarea corespunztoare acestei variabile dar la ieirea din funcie
valoarea citit nu este atribuit variabilei respective.
Parametrul format este un ir de caractere care poate conine specificatori de
format,caractere albe i alte caractere.
Caracterele albe vor fi ignorate.Celelalte caractere(care nu fac parte dintr-un specificator
de format) trebuie s fie prezente la intrare n poziiile corespunztoare.
Specificatorii de format au urmtoarea sintax:
% [*] [lg] [l/L] liter_tip
Observai c orice specificator de format ncepe cu caracterul %,conine obligatoriu o
liter care ndic tipul valorii care se citete i eventual alte elemente opionale.Litera care indic
tipul poate fi, de exemplu :
liter_tip
d

Semnificaie
Se citete un numr ntreg scris n baza 10,care va fi memorat ntr-o variabil
de tip int.

Se citete un numr ntreg scris n baza 8, care va fi memorat ntr-o variabil


de tip int.

Se citete un numr ntreg scris n baza 10, care va fi memorat ntr-o variabil
de tip unsignedint.

Se citete un numr ntreg scris n baza 16, care va fi memorat ntr-o variabil
de tip int.

f,e sau g

Se citete un numr real scris n baza 10, care va fi memorat ntr-o variabil de
tip float.
Se citete un caracter(n acest caz caracterele albe prezente la intrare nu se
ignor).

Se citete un ir de caractere (irul ncepe cu urmtorul caracter care nu este


alb i continu pn la primul caracter alb ntlnit sau pn la epuizarea
dimeniunii maxime lg din specificatorul de format).

Opional unele litere tip pot fi precedate cu litera l sau litera L.Literele d,o si x pot fi
precedate de litera l , caz n care valoarea citit va fi convertit la tipul long int. Litera u poate fi
precedata de litera l , caz n care valoarea citit va fi convertit la tipul unsigned long int .
Literele f,e , g pot fi precedate de litera l (caz n care valoarea citit este convertit de tipul
double ) sau litera L (caz n care valoarea citit este convertit la tipul long double).
Opional poate fi specificat i lg lungimea maxim a zonei din care se citete valoarea,
mai exact , funcia scanf () va citi maxim lg caractere,pn la ntlnirea unui caracter alb sau
caracter neconvertibil n tipul specificat de liter_tip.
Caracterul opional * specific faptul c la intrare este prezent o dat de tipul specificat
de acest specificator de format , dar ea nu va fi atribuit nici unuia dintre variabilele specificate
n lista de parametri ai funciei scanf ().
Observaie
1.S considerm urmtoarele declaraii de variabile:
int a; unsigned long b; double x;
S presupunem c de la tastatur sunt introduse caracterele: 312 -4.5 100000. Apelnd
funcia:
scanf("%d %lf %lu", &a, &x, &b);
Variabilei a i se atribuie valoarea 312, variabilei x i se atribuie valoarea -4.5, iar variabilei b i se
atribuie valoarea 100000.
2.S considerm urmtoarea declaraie de variabile:
char c1, c2, c3;
S presupunem c de la tastatur sunt introduse caracterele: 312. Apelnd funcia:
scanf("%c%c%c", &c1, &c2, &c3);
Variabilei c1 i se atribuie caracterul '3', variabilei c2 i se atribuie caracterul '1', iar variabilei c3 i
se atribuie caracterul '2'.
3.S considerm urmtoarele declaraii de variabile:
char c1, c2; unsigned a;
S presupunem c de la tastatur se introduce: 312 xd. Apelnd funcia:
scanf("%u%c%c", &a, &c1, &c2);
Variabilei a i se atribuie valoarea 312, variabilei c1 i se atribuie caracterul ' ' (spaiu), iar
variabilei c2 i se atribuie caracterul 'x'.
Apelnd funcia:
scanf("%u %c %c", &a, &c1, &c2);
Variabilei a i se atribuie valoarea 312, variabilei c1 i se atribuie caracterul 'x', iar variabilei c2 i
se atribuie caracterul 'd'.

4.S considerm urmtoarea declaraie de variabile:


int a, b, c;
S presupunem c de la tastatur se introduce: 3=1+2.
Apelnd funcia:
scanf("%d=%d+%d", &a, &b, &c);
Variabilei a i se atribuie valoarea 3, variabilei b i se atribuie valoarea 1, iar variabilei c i se
atribuie valoarea 2.
Apelnd funcia
scanf("%d=%*d+%d", &a, &b);
Variabilei a i se atribuie valoarea 3, variabilei b i se atribuie valoarea 2. Valoarea 1 a fost citit
dar nu a fost atribuit nici unei variabile.
5.S presupunem c de la tastatur se introduce o dat forma zz-ll-aa. Pentru a citi ziua,
luna i anul putem apela funcia:
scanf("%d-%d-%d",&zi, &luna, &an);

Scrierea datelor ntr-un fiier


Dup deschiderea fiierului ca fiier de ieire, se pot realiza operaii de scriere utiliznd
funcia fprintf().
int fprintf(fisier, format, expresie1, ..., expresien);
Prototipul funciei fprintf() este asemntor cu prototipul funciei printf(). Funcia fprintf()
are n plus, ca prim parametru, fiierul n care se face afiarea. n rest, semnificaia parametrilor,
rezultatului i efectul funciei sunt aceleai ca n cazul funciei printf().

Afiarea datelor cu format


Afiarea datelor pe ecran cu un format specificat se realizeaz apelnd funcia printf().
Aceast funcie este declarat n fiierul antet cstdio i are urmtoarea sintax:
int printf(format, expresie1, expresie2, ..., expresien)
Efect
Se evalueaz expresiile i se scriu n ordine valorile acestora ,n forma specificat de
parametrul format.
n caz de succes, funcia returneaz numrul de caractere afiate.
Parametrul format este un ir de caractere care poate conine specificatori format i
eventual alte caractere.n parametrul format trebuie s existe cte un specificator de format
pentru fiecare expresie din lista de parametri(specificatorul 1 corespunde expresiei 1,
specificatorul 2, corespunde expresiei 2, etc.)
Celelalte caractere din parametrul format vor fi afiate pe ecran n poziiile
corespunztoare.
Un specificator de format are urmtoarea sintax:
% [ind] [lg] [.prec] [l|L] liter_tip

Observai c un specificator de format ncepe cu caracterul %, trebuie s con in


obligatoriu o liter care s indice tipul expresiei corespunztoare i eventual alte elemente
opionale. Litera care indic tipul poate fi, de exemplu:

liter_tip
d

Semnificaie
Expresia se convertete din tipul int i se afieaz n baza 10.

Expresia se convertete din tipul int i se afieaz n baza 8.

Expresia se convertete din tipul unsigned i se afieaz n baza 10.

x, X

Expresia se convertete din tipul int i se afieaz n baza 16(literele care


reprezint 10,11,12,13,14,15 sunt majuscule pentru X sau minuscule pentru x).

Expresia se convertete din


parte_ntreag.parte_zecimal.

e, E

Expresia se convertete din tipul float i se afieaz n format exponenial


(tiinific) cifr.parte_zecimaleexponent . Pentru E litera care preced
exponentul este E.

Se aplic una dintre conversiile corespunztoare literei f sau literei e (cea care
reprezint cu numr minim de caractere)

Expresia are ca valoare codul ASCII al unui caracter i se afieaz caracterul


corespunztor.

tipul

float

se

afieaz

formatul

Expresia este un ir de caractere care va fi afiat pe ecran.


Opional,nainte de liter_tip poate s apar litera l sau litera L . Dac litera l apare
nainte de d,o,x, X sau u conversia se realizeaz din tipul long int (respectiv unsigned long int).
Dac litera l apare nainte de f, e , E sau g conversia se realizeaz din tipul double . Litera L
poate s precedeaz doar literel f, e, E sau g (caz n care conversia se realizeaz din tipul long
double)
Opional poate fi specificat lg numrul minim de caractere pe care se va realiza
afiarea. Dac numrul de caractere necesar pentru a afia valoarea expresiei depete lg, se vor
utiliza attea caractere cte sunt necesare. Dac numrul de caractere necesare pentru a afia
valoarea expresiei este mai mic dect lg, se vor utiliza lg caractere (restul zonei pe care se
realizeaz afiarea completndu-se cu spaii). Modul de aliniere implicit este la dreapta (deci

completarea cu spaii se realizeaz n stnga). Dac se specific indicatorul (minus) atunci


alinierea se va face la stnga (i completarea cu spaii se va realiza la dreapta).
Pentru expresiile de tip real sau ir de caractere se poate specifica i preciza prec. Pentru
valorile reale aceasta indic numrul de cifre de la partea zecimal care vor fi afiate (implicit 6
zecimale). Dac precizia este mai mic dect numrul de zecimale ale numrului real afiat,
atunci valoarea afiat va fi rotunjit (dac prima zecimal care nu se afieaz este mai mare sau
egal cu 5, atunci ultima zecimal afiat va fi mai mare cu 1).
Pentru iruri de caractere, precizia indic numrul de caractere din ir care se afieaz
(primele prec).

Exemple
S considerm urmtoarele declaraii de variabile
int a=-1, b=0567, d=0xf01a;
char c='x';
float x=-123.147, y=0.00008;
S urmrim efectul urmtoarelor apeluri ale funciei printf():
Apel
Pe ecran se afieaz:
printf("a=%d sau a=%u\n", a, a);
a=-1 sau a=65535
printf("x=%f sau\n x=%e sau\n x=%g\n", x=-123.147000 sau
x, x, x);
x=-1.231470e+02 sau
x=-123.147
printf("y=%f sau\n y=%e sau\n y=%g\n", y=0.000080 sau y=8.000000e-05 sau y=8e-05
y, y, y);
printf("b=%d sau b=%o sau b=%x \n", b, b=375 sau b=567 sau b=177
b, b);
printf("c=%c sau c=%d\n", c, c);

c=x sau c=120

printf("d=%d sau d=%x sau\n d=%u\n", d, d=-4070 sau d=f0la sau


d, d);
d=61466
printf("x=%.2f\n", x);

x=-123.15

printf("b=%6dxb=%-6dx\n", b, b);

b= 375xb=375 x

nchiderea fiierelor
Dup terminarea tuturor operaiilor care implic lucrul cu fiiere acestea trebuie nchise.Funcia
care realizeaz acest lucru este:

fclose(fisier);
Exemplu 1
S scriem un program care citete din fiierul de intrare nr.in un numr natural n (0<n100) i
apoi n valori naturale i afieaz n fiierul de ieire nr.out numerele citite descompuse n factori
primi, pe fiecare linie fiind scris cte un numr urmat de perechi de forma (d, p), indicnd
divizorul i puterea lui.

Exemplul 2
Scriei un program care creeaz o copie a fiierului intrare.txt cu numele iesire.txt.

2.Aplicatiin practice
1) Se citete un fiier TEST ce conine numere ntregi desparite prin spa iu sau ENTER. Sa se
afieze minimul i maximul din acel fiier.

#include <iostream>
Using namespace std;
#include<fstream.h>
#include<values.h>
void main()
{ ifstream f(test.txt);
/*
ifstream f;
f.open (numar.txt);

/*
if(!f) // sau f=NULL
{ cout<<Eroare la deschiderea fisierlui!<<endl;
return;}
int x, max=-MAXINT, min=MAXINT;
f.seekg(0,ios : :beg); //ne pozitionam la inceput
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;
int k;
cin>>k;
}
2) Se citete un fiier text ce conine numere ntregi despr ite prin spaiu sau ENTER. Se cere a se
calcula si afia pe ecran suma tuturor valorilor numerice din fi ier si numrul de elemente strict
negative.
#include<iostream.h>
using namespace std;
#include<fstream.h>
#include<values.h>
void main()
{
ifstream f("C:\\test.txt"); //sau: fstream f("C:\\test.txt",ios::in);
if(!f) //sau f=NULL
{
cout<<"Eroare la deschiderea fisierului!"<<endl;
return;
}
intx[100], n_neg=0, s=0, i;
f.seekg(0,ios::beg); //ne pozitionam la inceputul fisierului
i=0;
while(!f.eof())
{
f>>x[i];
if(x[i]<0)
n_neg++;
s+=x[i++];
}
f.close();
cout<<"Numarul elementelor negative: "<<n_neg<<endl;

cout<<"Suma tuturor elementelor: "<<s<<endl;


int k;
cin>>k;
}
3) Se citete un fiier TEXT ce conine numere ntregi desparite prin spa iu sau ENTER. S se afi eze
minimul i maximul din acel fiier. Se va defini o clas pentru numerele ntregi din fiier.
#include<iostream.h>
using namespace std;
#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("C:\\test.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;

cout<<"Maximul este: "<<max<<endl;


int k;
cin>>k;
}
4) Se citete un ir de la tastatur pn la ntalnirea caracterului "$". Dup citire datele se scriu ntr-un fi ier
text i se preiau din fiierul respectiv i se face contorizarea fiecrei vocale din fiier.
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
using namespace std;
void main()
{
char c;
int a=0,e=0,i=0,o=0,u=0;
ofstream f("C:\\test.txt");
if(!f)
{
cout<<"Eroare la deschidere."<<endl;
}
do{
c=getchar();
switch(c)
{
case 'a': a++; break;
case 'e': e++; break;
case 'i': i++; break;
case 'o': o++; break;
case 'u': u++;
}
if(c!='$')
f.put(c); //ar fi mers si f<<c;
}while(c!='$');
f.close();
ofstream g("C:\\test.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;
int k;

cin>>k;
}

5) S se sumeze valorile numerice dintr-un fiier text.

#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<fstream.h>
#include<stdio.h>
using namespace std;
void main()
{
char a[255], separator[]=" ,",cifre[]="0123456789.+-",*p;
double s=0;
fstream f("C:\\test.txt",ios::in);
if(!f)
{
cout<<"Eoare la deschiderea fisierului."<<endl;
return;
}
while(!f.eof())
{
f.getline(a,255,'\n');
p=strtok(a,separator); //se separa sirul folosind ca separator spatiul sau virgula
while (p)
{
if (strspn(p,cifre)==strlen(p))
s+=atof(p);
cout<<p<<"\n";
p=strtok(NULL,separator);
}
}
cout<<"Suma este: "<<s<<endl;
int k;
cin>>k;
}

6) A)
Crearea
unui
fiier
text
cu
date
numerice
Se citesc de la tastatur n numere naturale. Scriei numerele cititen fiierul "date.in". Pe prima
linie din fiier se va scrie numrul n,iar pe a doua linie cele n numere naturale, separate prin
cte un spaiu.
#include <fstream>
#include <iostream>
usingnamespace std;
int main()
{
ofstream fout("date.in");
int i,a,n;
cout<<"n=";
cin>>n;
fout<<n<<endl;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a;
fout<<a<<' ';
}
fout.close();
return0;
}

B)Citirea
datelor
numerice
Din fiierul de intrare "date.in" creat anterior se citesc cele n numere naturale.Afiai pe ecran cte
numere pare sunt n fiier i suma acestor numere.
#include <fstream>
#include <iostream>
usingnamespace std;
int main()
{
ifstream fin("date.in");
int i,a,n,np=0,sp=0;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>a;
if(a%2==0){np++;sp=sp+a;}
}
cout<<"nr pare="<<np<<endl;
cout<<"suma nr pare="<<sp;
fin.close();
return0;
}

7) A)
Afisarea
continutului
unui
fisier
text
pe
ecran
Scriei un program C++ care s afieze pe ecran coninutul fiierului text cu numele "ftext.cpp"
(numele
programului
surs
C++)
Rezolvare: Citirea n acest caz trebuie scris cu funcia get membr a clasei ifstream,
care citete toate caracterele din fiier, inclusiv cele albe. Operatorul de citire >> nu
poate fi folosit deoarece acesta ignor caracterele albe - spaiu, tab sau sfrit de linie,
iar
prin
folosirea
acestui
operator
rezultatul
citirii
este
incomplet.
n program trebuie s includem att biblioteca <fstream>, necesar pentru folosirea variabilei
de tip flux fin, ct i <iostream> necesar pentru utilizarea fluxului cout.

#include <fstream>
#include <iostream>
usingnamespace std;
int main()
{
ifstream fin("ftext.cpp");//numele fisierului text
char c;//variabila caracter
while(!fin.eof())//citim pn la sfritul fiierului
{
fin.get(c);//citim n c un caracter din fiier
cout<<c;//scriem caracterul c pe ecran
}
fin.close();//nchidem fiierul fin
return0;//ieirea din program
}

B)Scriei un program C++ care s copieze coninutul fiierului text cu numele text.in
n fiierul cu numele text.out.

#include <fstream>
#include <iostream>
usingnamespace std;
int main()
{
ifstream fin("text.in");
ofstream fout("text.out");
char c;
while(!fin.eof())
{
fin.get(c);
fout<<c;
}
fin.close();
fout.close();

return0;
}

8) Sa se afiseze, pentru un cuvant citit de la tastatura prefixele si sufixele acestuia.


#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ofstream f("BAC.txt");
char s[31];
int i,n,k;
int main()
{cout<<"sir: ";
cin>>s;
n=strlen(s);
for(k=0;k<=n;k++)
{
for(i=n-k;i<=n;i++)
f<<s[i];
f<<endl;
}
f<<endl;
for(k=1;k<=n;k++)
{
for(i=0;i<n-k+1;i++)
f<<s[i];
f<<endl;
f.close();
return 0;
}

Bibliografie

http://www.didactic.ro/materiale-didactice/681_grafuriorientate
http://infoscience.3x.ro/c++/Grafuri%20neorientate.htm
http://www.infoarena.ro/problema/dijkstra
http://infoscience.3x.ro/c++/roy_floyd.htm
http://www.infoarena.ro/problema/bellmanford
http://www.scrigroup.com/term/algoritmul-lui-bellmanford_c-2.php
http://www.scritube.com/stiinta/informatica/Notiunilede-graf-partial-si-s42553.php
http://lauramanolescu.wordpress.com/2012/06/07/drumu
ri-si-circuite-in-grafuri-orientate/

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