Fișiere text

Bază~14 min10 pași

De ce contează?

Un caiet are două roluri: îl deschizi ca să citești ce ai notat sau ca să scrii ceva nou. Un fișier text e la fel. La concursurile de informatică, datele de intrare vin dintr-un fișier și rezultatul îl scrii în altul — exact ca un schimb de bilețele cu evaluatorul.

De ce fișiere și nu tastatură

La OJI/ONI, programul tău citește dintr-un fișier (ex. date.in) și scrie în altul (ex. date.out). E mai sigur și reproductibil decât tastatura. Ai nevoie de biblioteca <fstream> și de două tipuri de fluxuri:

  • ifstreaminput file stream, pentru citire.
  • ofstreamoutput file stream, pentru scriere.
Observația-cheie

Ține minte după prima literă: ifstream = input (citire), ofstream = output (scriere). Odată deschise, le folosești exact ca pe cin și cout, cu aceiași operatori >> și <<.

Algoritm pas cu pas: suma a două numere din fișier

Fișierul date.in conține 4 7. Vrem suma în date.out.

  1. Deschidem date.in pentru citire și date.out pentru scriere.
  2. Citim cele două numere cu >>.
  3. Scriem suma cu <<.
  4. Închidem fluxurile.
#include <fstream>
using namespace std;

int main() {
    ifstream fin("date.in");     // deschide pentru citire
    ofstream fout("date.out");   // deschide pentru scriere

    int a, b;
    fin >> a >> b;               // citeste 4 si 7
    fout << a + b << "\n";       // scrie 11

    fin.close();
    fout.close();
    return 0;
}

Singura diferență față de cin/cout: folosești fin/fout. Logica e identică.

Citire până la sfârșitul fișierului

Când fișierul conține un număr necunoscut de valori, citește în buclă cât timp reușești:

#include <fstream>
using namespace std;

int main() {
    ifstream fin("numere.in");
    ofstream fout("numere.out");

    int x;
    long long suma = 0;
    while (fin >> x) {           // se opreste la sfarsitul fisierului
        suma += x;
    }
    fout << suma << "\n";

    fin.close();
    fout.close();
    return 0;
}
Observația-cheie

while (fin >> x) e geamănul lui while (cin >> x). Returnează „adevărat" cât timp a citit un număr și „fals" la EOF (end of file). Bucla se oprește singură — nu ai nevoie să știi câte numere sunt în fișier.

Verifică dacă fișierul s-a deschis

Dacă numele e greșit sau fișierul lipsește, citirea eșuează tăcut. La depanare e util să verifici:

ifstream fin("date.in");
if (!fin) {
    // fisierul nu s-a deschis: nume gresit sau inexistent
    return 1;
}

Complexitate

Citirea/scrierea unei valori e O(1); pentru n valori, costul total e O(n) — proporțional cu volumul datelor, exact ca la cin/cout.

Greșeli frecvente

Greșeli reale cu fișiere:

  • Nume greșit: ceri date.in dar fișierul cerut de problemă e suma.in → programul nu citește nimic și lucrează cu gunoi. Citește enunțul cu atenție.
  • Confuzi ifstream cu ofstream: încerci să citești dintr-un flux de ieșire → nu funcționează.
  • Ai uitat #include <fstream>: ifstream apare ca „nedeclarat".
  • Amesteci cin/cout cu fin/fout: dacă problema cere fișiere, tot I/O-ul trece prin fin/fout, nu prin tastatură/ecran.

De reținut

  • ifstream fin("x.in") citește, ofstream fout("x.out") scrie; le folosești ca cin/cout.
  • while (fin >> x) parcurge fișierul până la sfârșit, fără să știi câte valori sunt.
  • Respectă exact numele de fișiere din enunț și nu amesteca tastatura cu fișierele.

Întrebarea 1 / 3

Ce tip de obiect folosești pentru a CITI dintr-un fișier text?