Ce face std::ifstream
std::ifstream („input file stream”) este un flux de citire legat de un fișier. Se folosește exact ca std::cin: >> citește cuvinte și numere, iar std::getline citește rânduri întregi.
Fișierul se deschide în constructor și se închide automat când variabila iese din domeniu (la acolada de închidere). Dacă fișierul nu există sau nu poate fi citit, fluxul ajunge în stare de eroare: verifici cu if (!fisier) sau fisier.is_open().
Calea este relativă la directorul curent al programului (nu neapărat directorul fișierului sursă). Exemplele de mai jos creează întâi fișierul cu std::ofstream, apoi îl citesc.
Exemple
Exemplul 1: Citirea unui fișier rând cu rând
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ofstream("orase.txt") << "Iași\nCluj-Napoca\nTimișoara\n";
std::ifstream fisier("orase.txt");
std::string rand;
int nr = 0;
while (std::getline(fisier, rand)) {
std::cout << ++nr << ": " << rand << '\n';
}
}
Rezultat
1: Iași
2: Cluj-Napoca
3: Timișoara
Exemplul 2: Citirea numerelor și calculul mediei
#include <fstream>
#include <iostream>
#include <string>
int main() {
{
std::ofstream out("note.txt");
out << "Ana 9\nMihai 7\nIoana 10\n";
} // aici out se închide și datele ajung în fișier
std::ifstream in("note.txt");
std::string nume;
int nota, suma = 0, cate = 0;
while (in >> nume >> nota) {
std::cout << nume << " are nota " << nota << '\n';
suma += nota;
++cate;
}
std::cout << "Media clasei: " << static_cast<double>(suma) / cate << '\n';
}
Rezultat
Ana are nota 9
Mihai are nota 7
Ioana are nota 10
Media clasei: 8.66667
Exemplul 3: Fișier care nu există
#include <fstream>
#include <iostream>
int main() {
std::ifstream fisier("nu_exista.txt");
if (!fisier) {
std::cout << "Nu am putut deschide fișierul.\n";
return 0;
}
std::cout << "Fișier deschis.\n";
}
Rezultat
Nu am putut deschide fișierul.
Greșeli frecvente
- Nu verifici dacă fișierul s-a deschis: dacă lipsește, toate citirile eșuează în tăcere și programul lucrează cu variabile neschimbate.
- Scrii
while (!fisier.eof())ca buclă de citire: ultima valoare poate fi prelucrată de două ori. Pune citirea direct în condiție:while (fisier >> x). - Citești un fișier pe care încă îl scrii cu un
std::ofstreamdeschis: datele pot fi încă în buffer. Închide fluxul de scriere (sau ieși din blocul lui) înainte de citire.
Comenzi înrudite
std::ofstream: Creează sau deschide un fișier pentru scriere și scrie în el la fel ca în std::cout.std::fstream: Flux de fișier care poate și citi, și scrie în același fișier.std::ifstream::open: Deschide, verifică și închide fișierul unui flux: open, is_open, close.std::getline: Citește un rând întreg, cu spații cu tot, într-un std::string.std::istream::eof: Verifică starea unui flux: eof (sfârșitul datelor) și fail (citire eșuată).