Teorie
Lucrul cu fișiere în C++ la atestatul de informatică
Citirea din fișiere text cu ifstream: matrici, șiruri de caractere, citire până la sfârșit, structuri și sortare după o valoare calculată — cu problemele de atestat în care apar.
5
minute de citit
8
secțiuni
115
probleme rezolvate legate
Actualizat pe .
Pe această pagină
15 din cele 40 de probleme de programare din sesiunea Dolj 2026 citesc datele dintr-un fişier.
Vestea bună: ifstream se folosește exact ca cin, iar odată ce știi cele trei moduri de
citire, partea de fişiere devine mecanică și te poți concentra pe logica problemei.
Scheletul de bază
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f("date.in"); // deschidere
// ... citire cu f >> sau f.getline
f.close(); // inchidere
}ifstream e „ruda" lui cin pentru fişiere. Tot ce știi despre cin >> funcționează identic cu
f >>. Diferă doar două lucruri: îl deschizi cu numele fişierului și îl închizi la final.
f.close() nu schimbă rezultatul la programe mici, dar e cerut de barem — scrie-l.
Cele trei moduri de citire
Alegerea depinde de ce conține fişierul. E singura decizie reală pe care o iei.
1. Știi câte valori sunt
Formatul cel mai comun: prima linie spune cât urmează.
int n;
f >> n;
for (int i = 0; i < n; i++) f >> x[i];Pentru matrici, n e dimensiunea și urmează două bucle imbricate:
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
f >> a[i][j];Toate cele 9 probleme cu matrici folosesc acest tipar, cu fişierul mat.in. Detaliile de
parcurgere — linii, coloane, diagonale — sunt explicate pe pagina dedicată
matricilor.
2. Nu știi câte valori sunt
Când fişierul conține doar numere, fără un n la început, citești până se termină:
int n = 0;
while (f >> x[n]) n++;Citirea returnează o valoare care devine false când nu mai are ce citi, deci bucla se oprește
singură. La final, n conține exact numărul de valori.
Același tipar funcționează și pe cuvinte, pentru că >> se oprește automat la spații:
while (f >> cuvant) { /* ... */ }3. Un rând întreg de text
Când fişierul conține o propoziție, cu spații și semne de punctuație:
char s[201];
f.getline(s, 201);f >> s nu merge aici — s-ar opri la primul spațiu și ai prelua doar primul cuvânt.
Dimensiunea e 201 pentru „cel mult 200 de caractere": mai trebuie un loc pentru terminatorul
'\0', pe care C++ îl adaugă la final. Parcurgerea merge până la el, deci nu ai nevoie de lungime:
for (int i = 0; s[i] != '\0'; i++) { /* ... */ }Exersează pe subiecte reale
Exersează pe subiecte reale
Lucrul cu caractere
Două tehnici acoperă majoritatea subiectelor cu text.
Conversia majusculă → minusculă, ca să nu scrii zece comparații:
if (c >= 'A' && c <= 'Z') c = c + 32;Funcționează pentru că, în ASCII, literele mici sunt cu exact 32 de poziții după cele mari
('A' = 65, 'a' = 97). Verificarea intervalului e necesară — altfel strici cifrele și semnele de
punctuație.
Compararea cuvintelor se face cu strcmp, nu cu ==:
if (strcmp(cuvant, cautat) == 0) nr++;== compară adresele din memorie, nu conținutul. Iar strcmp returnează 0 la egalitate, nu
1 — valoarea returnată e diferența în ordine alfabetică. Necesită #include <cstring>.
Structuri și sortare după o valoare calculată
Când fişierul conține perechi de numere care formează o entitate — un număr complex, o fracție,
un elev — se folosește struct. Astfel datele rămân lipite la sortare.
Tiparul are trei câmpuri: datele originale plus valoarea după care sortezi, calculată o singură dată la citire:
struct Fractie {
int a, b; // datele din fisier
double valoare; // ce folosesti la comparatii
};
f >> fr[i].a >> fr[i].b;
fr[i].valoare = (double)fr[i].a / fr[i].b;Conversia (double) e obligatorie. Între doi int, a / b dă împărțire întreagă: 1 / 4
ar fi 0, nu 0.25, iar sortarea ar ieși complet greșită.
Sortarea interschimbă structura întreagă, deci câmpurile nu se desperechează:
if (fr[j].valoare < fr[i].valoare) { // "<" crescator, ">" descrescator
Fractie aux = fr[i];
fr[i] = fr[j];
fr[j] = aux;
}Exersează pe subiecte reale
Formatarea numerelor reale
Când enunțul cere un anumit număr de zecimale:
#include <iomanip>
cout << fixed << setprecision(2) << x; // mereu 2 zecimale: 5.00Se scrie o singură dată, înainte de buclă — setarea rămâne activă.
Diferența care contează: cu fixed numeri zecimalele; fără fixed, setprecision
numără cifrele semnificative, iar zecimalele nule dispar (5 în loc de 5.00). Citește exemplul
din enunț ca să vezi care formă se cere.
Greșeli care se repetă
f >> sîn loc def.getlinepentru text cu spații — se citește doar primul cuvântchar s[200]pentru „cel mult 200 de caractere" — lipsește locul terminatoruluicuvant == cautatîn loc destrcmp— compară adrese, nu conținutstrcmp(...) == 1— funcția returnează0la egalitate- Resetarea contorului între două fişiere citite în același vector
- Împărțirea fără
(double)la sortarea după o valoare calculată - Citirea parametrilor din fişier când enunțul îi cere de la tastatură
f.close()uitat — cerut de barem
Mai departe
Unde exersezi mai departe
Citirea din fișier până la sfârșit și formatarea ieșirii se greșesc ușor — merită exersate pe probleme verificate automat.
Pentru asta, pbinfo.ro e cea mai bună resursă românească: peste 2500 de probleme de informatică cu evaluator automat, și o trimiți la testat direct din browser. E construită pentru olimpiadă și bacalaureat, deci se completează cu ce găsești aici — noi acoperim subiectele de atestat, cu rezolvări scrise.
Toate problemele din această categorie
Fiecare are rezolvare completă în C++, explicată pas cu pas.
115Arată toate problemele rezolvateAscunde lista115 programare
- Arbore dat prin vectorul de tați: rădăcina, nodurile cu cei mai mulți fii și frunzele (subprogramul pozitie)
- Cea mai lungă secvență de numere prime consecutive (subprogramul prim)
- Cel mai lung cuvânt din fiecare propoziție și numărul de vocale (vocale și cuvant)
- Cel mai lung prefix și sufix palindrom al unui cuvânt
- Cel mai mare număr format din cifrele dintr-un fișier
- Cel mai mare număr perfect dintr-un fișier și prima lui poziție (subprogramul perfect)
- Cel mai mare palindrom de pe diagonalele matricei (oglindit și maxim)
- Cel mai mic multiplu de k dintre două elemente consecutive, în fișier
- Cele mai mari două numere perfecte dintr-un fișier
- Cele mai mari două valori distincte dintr-un fișier și de câte ori apar
- Cifra de control prim — câte numere au cifra de control număr prim
- Cifra maximă egală cu cea a ultimului element
- Cifrele care nu apar într-un fișier, afișate descrescător
- Coloana cu suma maximă dintr-o matrice
- Coloanele complementare cu prima coloană
- Cuvinte cu cel puțin trei vocale și două consoane alăturate (verif și nrvoc)
- Cuvinte cu prima literă mare și numărul total de litere mari (nrlit și trans)
- Cuvinte formate numai din vocale și cuvinte care conțin „str” (subprogramul vocale)
- Cuvintele care conțin litera cu care începe primul cuvânt
- Cuvintele cu cele mai multe vocale
- Cuvintele palindrom dintr-un fișier
- Căutare binară printre numerele de trei cifre, ordonate descrescător (construire și cautare)
- Decodificarea unui text: vocale ca cifre, consoane deplasate (construieste și decodifica)
- Dreptunghiul de arie maximă determinat de două puncte (struct punct: distanta și arie)
- Elementele comune ale unui tablou crescător și ale unuia descrescător (subprogramul tablou)
- Eliminarea coloanei cu k elemente formate doar din cifre impare
- Eliminarea cuvintelor cu atâtea vocale câte consoane
- Eliminarea nodurilor de grad minim și numărul muchiilor rămase (nrElem1 și sumaElem)
- Entitățile lexicale care conțin cifre și inițialele transformate în majuscule (subprogramul cifre)
- Fiecare cuvânt urmat de atâtea puncte câte litere are; cuvintele cu cratimă (subprogramul puncte)
- Fiecare cuvânt începe cu literă mare
- Graf neorientat: nodurile de grad maxim și nodurile izolate (subprogramul suma_x)
- Graf orientat: vârfurile cu gradul interior egal cu cel exterior și numărul de arce
- Inversarea cifrelor, fără prima, la numerele cu peste 4 divizori (inversareCifre și nrDivizori)
- Liniile matricei care nu conțin niciun zero
- Literele comune tuturor cuvintelor (citire și stergere)
- Matrice inferior triunghiulară și determinantul ei (inftr și produs recursiv)
- Matrice parcursă șerpuit cu șirul 0, 1, 2, 0, 1, 2, …
- Maximele pe linie aflate pe diagonală și sub diagonala principală
- Media numerelor prime din șirul lui Fibonacci aflate într-o matrice (fibo și divprim)
- Minimul, maximul și media lor pe fiecare linie a unui fișier
- Modulele numerelor complexe dintr-un fișier, afișate în ordine descrescătoare
- Momente ale zilei în format hh:mm:ss, cu tipul struct clipa (subprogramul timp)
- Nodurile izolate dintr-un graf dat prin matricea de adiacență (citire și suma)
- Numere cu număr impar de divizori sub diagonala secundară
- Numere cu prima cifră pătrat perfect, ordonate descrescător (p_cifra recursiv și sortare)
- Numere divizibile cu 10 după eliminarea cifrelor impare
- Numere puternice — suma cifrelor ridicate la puterea numărului de cifre
- Numere quasi-amiabile — perechile de pe aceeași linie
- Numere rotunde — același număr de cifre 0 și 1 în baza 2
- Numerele cu cifre identice mai mici sau egale cu n, scrise în fișier
- Numerele cu tot atâtea cifre de 0 și de 1 în baza 2
- Numerele de două cifre care nu apar într-un șir
- Numerele de două cifre dintr-un fișier, distincte și în ordine crescătoare
- Numerele de trei cifre care apar de exact două ori într-un fișier, descrescător
- Numerele din intervalul (p, q) al căror oglindit este prim, scrise în fișier
- Numerele din ultimele două linii nemodificate după ascunderea ultimelor k cifre
- Numerele echilibrate dintr-un fișier, în ordinea inversă citirii
- Numerele palindrom cu exact k divizori dintr-un fișier
- Numerele palindrom situate după primul număr par
- Numerele pare dintre primul și ultimul număr prim
- Numerele perfecte de pe diagonala secundară
- Numerele prime de pe conturul matricei
- Numerele prime de pe diagonalele matricei, prin divizorul prim maxim
- Număr real scris ca raport de două numere naturale cu diferența minimă
- Numărul cu cei mai mulți divizori proprii (ultimul, la egalitate)
- Numărul de apariții al fiecărei cifre și cifra de control (subprogramul gaseste_cifra)
- Numărul din cifrele unui text: întâi impare crescător, apoi pare descrescător (cifra și numar)
- Numărul extrem cu același număr de cifre (subprogramul numar_cifre)
- Numărul format din prima cifră a fiecărui număr — divizibil cu 3
- Numărul maxim de consoane dintr-un cuvânt; cuvintele de lungime pară cu inițială mare (subprogramul consoane)
- Numărul prim cu cele mai multe cifre pare dintr-o matrice (prim și contorizare recursiv)
- Oglinditul cifrelor pare — câte numere au același oglindit ca primul element
- Ordonarea diagonalei principale prin interschimbări de linii și coloane
- Palindroame pe diagonala principală sau secundară a matricei
- Palindromurile dintr-un interval și palindromul asociat unui număr (subprogramul oglinda)
- Perechi consecutive de numere neprime, dar prime între ele (subprogramele nr_prim și cmmdc)
- Poziția unui element în vectorul ordonat, fără a-l ordona
- Prefixele și sufixele cuvintelor de lungime minimă și maximă (prefixe și sufixe)
- Prima cifră egală cu ultima — numere din fișier
- Prima literă a fiecărui cuvânt înlocuită cu 0, ultima cu 9
- Primele k numere dintr-un fișier, afișate în ordine crescătoare
- Punctele aflate pe cercul cu centrul în origine și raza r (struct punct, subprogramul distanta)
- Rădăcina și matricea de adiacență a unui arbore dat prin vectorul de tați
- Rădăcinile pătratelor de numere prime dintr-un șir terminat cu 1 (subprogramul nr_div)
- Simplificarea fracțiilor din fișier cu cel mai mare divizor comun
- Sortarea descrescătoare a unor numere reale cu poziția maximului (citeste și pozmax)
- Suma cifrelor fiecărui număr dintr-un fișier
- Suma elementelor pare și produsul elementelor impare dintr-un fișier
- Suma fracțiilor ireductibile (struct fractie: cmmdc și suma)
- Suma maximă a cifrelor pare dintr-un șir de numere (subprogramul cifre_pare)
- Suma numerelor complexe cu modul întreg (struct complexi: modul și suma)
- Sumele parțiale ale unui vector, scrise în fișier
- Să se afişeze cel mai mare element din matrice şi poziţiile pe care apare
- Să se afişeze cel mai mic element din matrice şi poziţiile pe care apare
- Să se afişeze indicii coloanelor care au toate elementele impare
- Să se afişeze indicii liniilor care au toate elementele pare
- Să se afişeze maximele de pe fiecare linie
- Să se afişeze media aritmetică a elementelor strict pozitive
- Să se afişeze numărul valorilor distincte din fişier şi valoarea maximă
- Să se afişeze, în ordine crescătoare, numerele distincte din cele două fişiere
- Să se calculeze şi să se afişeze media aritmetică a elementelor situate pe diagonala secundară
- Să se determine numărul de vocale din şir
- Să se numere apariţiile unui cuvânt dat, citit de la tastatură, în text
- Să se ordoneze crescător fracţiile, afişând valorile zecimale ale lor
- Să se schimbe între ele două linii l1 şi l2, date de la tastatură
- Titluri de cărți: câte au exact două majuscule și care conțin litera M (subprogramul majuscule)
- Toate secvențele care încep și se termină cu valoarea k (subprogramul secv_tablou)
- Valorile impare de pe cele două diagonale ale unei matrice (subprogramele nrpare_p și nrpare_s)
- Verificarea dacă o matrice este simetrică față de diagonala principală
- Verificarea dacă un vector este o permutare a mulțimii {1, 2, …, n}
- Vocalele distincte dintr-un text din fișier, în ordine alfabetică
- Înjumătățirea cifrelor — câte numere au toate cifrele pare
- Înjumătățirea numerelor cu toate cifrele pare (subprogramele verif și modif)
- Ștergerea din vector a numerelor cu cifre de aceeași paritate (sterge și cif)
Alte pagini de teorie