Lucrul cu fisiere
8Urmatorul articol prezinta diferite moduri in care putem utiliza fisierele. In loc sa citim datele unei probleme de la tastura,le putem „lua” dintr-un fisier. In plus, lucrul cu fisiere este necesar in rezolvarea problemelor de olimpiada, care au date de intrare/iesire citite din fisier.
Asadar,sa ne apucam de treaba:
Pentru a putea efectua diferite operatii cu si in fisiere avem nevoie de biblioteca <fstream.h> .
1) Citirea din fisier
Sa spunem ca vrem sa citim dintr-un fisier un numar x. Fisierul se numeste „nr.txt”, trebuie sa-l cream si sa introducem in el numarul x.
#include <iostream.h> #include <fstream.h> #include <conio.h> int main() { ifstream f("nr.txt"); int x; f>>x; f.close(); cout<<"numarul citit din fisier este: "<<x; getch(); return 0; }
Observati acel ifstream f(„nr.txt”); Putem spune ca ifstream este instructiunea de citire din fisier. Forma generala este:
ifstream variabila_fisier(„numefisier.extensie”);
Variabia_fisier este in cazul nostru f.
Fisierul:
Va afisa cu ajutorul codului de mai sus:
Observati ca ma inchis fisierul cu f.close( ) . De obicei, este bine sa inchidem fisierele imediat ce am terminat lucrul cu ele.
Am putea declara fisierele si asa:
fstream f(„nr.txt”,ios::in);
Dar evaluatoarele gen infoarena nu prea accespta acest tip de declarare. Desi este mai facil, eu recomand folosirea primei variante (si mie imi place mai mult cea cu ios:: , dar…..).
Am utilizat ifstream pentru datele de intrate,sa vedem cu sta treaba si cu datele de iesire:
2) Scrierea intr-un fisier
Vrem sa citim un numar de la tastatura si sa-l bagam in fisierul out.txt. Avem urmatorul cod:
#include <iostream.h> #include <fstream.h> int main() { ofstream g("out.txt"); int n; cout<<"Dati numarul: ";cin>>n; g<<n; g.close(); return 0; }
Forma este ofstream variabila_fisier(„nume.extensie”); In cazul nostru, variabila_fisier este g.
In fisierul „out.txt” va aparea:
Putem scrie si cu :
fstream g(„out.txt”,ios::out);
Pentru a scrie in fisier nu este nevoie sa-l cream.Va fi creat automat.
Acestea au fost principalele functii legate de fisiere, sa vedem cum sta cu structurile de date:
3) Vectori si fisiere
Vom citi din fisierul „vect.in” numarul de elemente (care se afla pe prima linie),apoi elementele din vector.Le vom afisa si apoi vom introduce in fisierul „vect.out” numai elementele.
include <iostream.h> #include <fstream.h> #include <conio.h> int main() { ifstream f("vect.in"); ofstream g("vect.out"); int v[100],n,i; f>>n; for (i=0;i<n;i++) f>>v[i]; f.close(); for (i=0;i<n;i++) cout<<v[i]<<" "; for (i=0;i<n;i++) g<<v[i]<<" "; g.close(); getch(); return 0; }
Fisier de intarare:
Afisare:
Fisier de iesire:
4) Matrice si fisiere
Vrem sa citim din fisierul „mat.in” o matrice.Pe prima linie se afla numarul de linii si numaurl de coloane (exact in aceasta ordine), iar pe urmatoarele m linii elementele matricei. Vom afisa numarul de linii si coloane,precum si elementele matricei.Apoi vom introduce numari matricea in fisierul „mat.out”.
#include <iostream.h> #include <fstream.h> #include <conio.h> int main() { ifstream f("mat.in"); ofstream g("mat.out"); int a[10][10],i,j,m,n; f>>m>>n; for (i=0;i<m;i++) for (j=0;j<n;j++) f>>a[i][j]; f.close(); cout<<"nr de linii: "<<m<<endl; cout<<"nr de coloane: "<<n<<endl; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout<<a[i][j]<<" "; } cout<<endl; } for (i=0;i<m;i++) { for (j=0;j<n;j++) { g<<a[i][j]<<" "; } g<<endl; } g.close(); getch(); return 0; }
Fisier de intarare:
Afisare:
Fisier de iesire:
5) Struct si fisiere
Vom citi din fisierul „copil.in” numarul de copii (pe prima linie,n), numele,prenumele,varsta,clasa si vom afisa numele celui mai mic copil.
#include <iostream.h> #include <stdio.h> #include <conio.h> #include <fstream.h> int main() { ifstream f("copil.in"); struct copil { char nume[10],prenume[10]; int varsta,clasa; }e[3]; int i,min,k,n; f>>n; for (i=0;i<n;i++) f>>e[i].nume>>e[i].prenume>>e[i].varsta>>e[i].clasa; f.close(); min = e[0].varsta; for (i=1;i<3;i++) if (e[i].varsta<min) min=e[i].varsta; cout<<"min="<<min<<endl; for (i=0;i<3;i++) if (min==e[i].varsta) cout<<"Cel mai mic copil: "<<e[i].nume<<" "<<e[i].prenume; getch(); return 0; }
Fisier intrare:
Afisare:
Ca „Tema” , va propun rezolvarea unei probleme simple, de pe infoarena. Este necesar sa cunoasteti fisiere. 🙂
Cam asta este cu fisierele, totul este scris pe scurt. If you like it, tell me. 😀
Destul de dragut.Ca o completare as putea spune faptul ca in general eu nu folosesc aceasta metoda pentru lucrul cu fisiere.Poate unii dintre voi au observat ca folosesc in probleme freopen.
Cum lucreaza?
Pentru a citi mai multe variabile facem astfel :
Formatare text :
Asta-i varianta de C. Eu prefer sa lucrez in C numai cu stringurile, in rest C++. Mi se pare mi usor…
Foarte fain.Good Work 😀
Gusturile nu se discuta.Si eu prefer C++ in anumite situatii insa exista zvonuri cum ca aceasta metoda ar fi ceva mai rapida in anumite situatii.
Am intampinat si cateva probleme pe infoarena care schimband metoda de citire/scriere luam maxim sau pierdeam multe puncte.
E bine sa le stii pe ambele si sa lucrezi cu ambele probleme pentru a vedea care ofera mai multe rezultate pozitive 🙂
Din ceea ce am vazut si experimentat eu, citirea e mai rapida cu streamuri, insa afisarea este mult mai inceata. Asta insa doar pe versiunile mai noi de compilatoare GNU (de la 4.2 in sus). Pe .campion de exemplu unde se foloseste o versiune mai veche (3.2 cred) folosirea streamurilor este contraindicata. 🙂
Daca primesc ceva permisiuni m-as baga si eu la dezvoltarea siteului, ideea mi se pare faina.
Vorbim pe Y! Messenger. Just Click
ai o greseala in ultimul program .. min este negativ pt ca nu il initializezi inainte si este intotdeauna mai mic decat oricare e[i].varsta si da ceva aiurea la iesire .. cred ca ar trebui min = e[0].varsta; inainte de for. bafta
Mersi Adrian pentru observatie. 😀