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:
ifstream— input file stream, pentru citire.ofstream— output file stream, pentru scriere.
Ț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.
- Deschidem
date.inpentru citire șidate.outpentru scriere. - Citim cele două numere cu
>>. - Scriem suma cu
<<. - Î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;
}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 reale cu fișiere:
- Nume greșit: ceri
date.indar fișierul cerut de problemă esuma.in→ programul nu citește nimic și lucrează cu gunoi. Citește enunțul cu atenție. - Confuzi
ifstreamcuofstream: încerci să citești dintr-un flux de ieșire → nu funcționează. - Ai uitat
#include <fstream>:ifstreamapare ca „nedeclarat". - Amesteci
cin/coutcufin/fout: dacă problema cere fișiere, tot I/O-ul trece prinfin/fout, nu prin tastatură/ecran.
De reținut
ifstream fin("x.in")citește,ofstream fout("x.out")scrie; le folosești cacin/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.