Documente Academic
Documente Profesional
Documente Cultură
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.
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).
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.
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;
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)
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 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).
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'.
liter_tip
d
Semnificaie
Expresia se convertete din tipul int i se afieaz n baza 10.
x, X
e, E
Se aplic una dintre conversiile corespunztoare literei f sau literei e (cea care
reprezint cu numr minim de caractere)
tipul
float
se
afieaz
formatul
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);
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;
cin>>k;
}
#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;
}
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/