Teorie: Generalități despre Fișiere (<fstream>)
Citirea și scrierea datelor folosind fișiere text (ifstream, ofstream). Citirea până la EOF.
Lucrul cu Fișiere Text în C++
Până acum am citit date de la tastatură (cu cin) și am afișat rezultate pe ecran (cu cout). Însă, la Bacalaureat (și în practică), datele sunt adesea prea multe pentru a fi introduse manual de fiecare dată.
Aici intervine lucrul cu fișiere text. Pentru a putea citi și scrie în fișiere, trebuie să includem biblioteca <fstream> (File Stream). Aceasta ne oferă două tipuri de date esențiale: ifstream (pentru citire/input) și ofstream (pentru scriere/output).
1. Concepte de bază: Citire și Scriere
ifstream (Input File Stream)
Se folosește pentru a citi date dintr-un fișier. Odată deschis fișierul, îl putem folosi exact așa cum foloseam cin.
// Declarăm o variabilă 'fin' și deschidem fișierul
ifstream fin("date.in");
int x;
fin >> x; // Citim x din fișierofstream (Output File Stream)
Se folosește pentru a scrie date într-un fișier. Odată deschis, îl putem folosi exact așa cum foloseam cout.
// Declarăm variabila 'fout' și deschidem/creăm fișierul
ofstream fout("date.out");
int x = 10;
fout << x; // Scriem x în fișier2. Exemple practice
Exemplul 1: Citirea unui vector dintr-un fișier și afișarea sumei în alt fișier
Fișierul bac.in conține pe prima linie un număr n, iar pe a doua linie n numere. Trebuie să scriem suma lor în bac.out.
#include <iostream>
#include <fstream> // Nu uita biblioteca!
using namespace std;
ifstream fin("bac.in");
ofstream fout("bac.out");
int main() {
int n, v[100], suma = 0;
// Folosim 'fin' în loc de 'cin'
fin >> n;
for(int i=0; i<n; i++) {
fin >> v[i];
suma = suma + v[i];
}
// Folosim 'fout' în loc de 'cout'
fout << suma;
return 0;
}Exemplul 2: Citirea "până la sfârșitul fișierului" (EOF)
Deseori la Subiectul III (problema de eficiență), ți se dau numere într-un fișier, dar NU știi câte numere sunt (lipsește acel n de la început). În acest caz, trebuie să citești cât timp există date în fișier folosind construcția while(fin >> x).
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("numere.in");
int main() {
int x;
// Expresia 'fin >> x' returnează 'true' cât timp reușește să citească ceva
while (fin >> x) {
cout << "Am citit numărul: " << x << endl;
}
return 0;
}Capcane frecvente la Bacalaureat
- Fișierul .out se creează automat: Dacă fișierul pentru scriere (ex:
bac.out) nu există pe hard disk, programul tău îl va crea automat. Totuși, fișierul pentru citire (bac.in) trebuie să existe deja, altfel programul nu va citi nimic! - Declararea globală a variabilelor de fișier: Este o practică excelentă (mai ales la examen) să declari
ifstream fin("nume.in");global, în afara funcțieimain. Astfel, vor putea fi folosite în orice subprogram. - Nu uita biblioteca: Erorile de compilare de genul
"ifstream was not declared in this scope"înseamnă 100% că ai uitat să scrii#include <fstream>la începutul codului.