Sari la conținut
Înapoi la teorie

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ă
  1. Scheletul de bază
  2. Cele trei moduri de citire
  3. Lucrul cu caractere
  4. Structuri și sortare după o valoare calculată
  5. Formatarea numerelor reale
  6. Greșeli care se repetă
  7. Unde exersezi mai departe
  8. Toate problemele din această categorie

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ă

C++
#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ă.

C++
int n;
f >> n;
for (int i = 0; i < n; i++) f >> x[i];

Pentru matrici, n e dimensiunea și urmează două bucle imbricate:

C++
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ă:

C++
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:

C++
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:

C++
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:

C++
for (int i = 0; s[i] != '\0'; i++) { /* ... */ }

Exersează pe subiecte reale

Lucrul cu caractere

Două tehnici acoperă majoritatea subiectelor cu text.

Conversia majusculă → minusculă, ca să nu scrii zece comparații:

C++
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 ==:

C++
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:

C++
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ă:

C++
if (fr[j].valoare < fr[i].valoare) {    // "<" crescator, ">" descrescator
    Fractie aux = fr[i];
    fr[i] = fr[j];
    fr[j] = aux;
}

Formatarea numerelor reale

Când enunțul cere un anumit număr de zecimale:

C++
#include <iomanip>
cout << fixed << setprecision(2) << x;      // mereu 2 zecimale: 5.00

Se 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 de f.getline pentru text cu spații — se citește doar primul cuvânt
  • char s[200] pentru „cel mult 200 de caractere" — lipsește locul terminatorului
  • cuvant == cautat în loc de strcmp — compară adrese, nu conținut
  • strcmp(...) == 1 — funcția returnează 0 la 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 rezolvate115 programare