# Fișiere text în C++

> Pagina: https://bacalaurescu.ro/informatica/lectii/fisiere-text/citirea-din-fisiere
> Markdown: https://bacalaurescu.ro/informatica/lectii/fisiere-text/citirea-din-fisiere.md
> Sursa: Bacalaurescu (bacalaurescu.ro), conținut gratuit pentru BAC 2027.

Materia: [Informatică](https://bacalaurescu.ro/informatica)

Capitolul: [Fișiere text](https://bacalaurescu.ro/informatica/lectii/fisiere-text)
Actualizat: 2026-11-01

Citirea și scrierea în fișiere text, citirea până la sfârșitul fișierului, tipare de BAC.

## Pe scurt pentru BAC

- `ifstream` deschide un fișier de intrare, `ofstream` unul de ieșire, iar ambele cer `#include <fstream>`.
- Fluxurile de fișier se folosesc exact ca `cin` și `cout`, de exemplu `fin >> x` și `fout << maxim`.
- Un număr necunoscut de valori se citește cu `while (fin >> x)`, care devine fals când nu mai există valori.
- Pentru ultimele două valori citite reții `prec` și `curent` și actualizezi în ordinea `prec = curent; curent = x;`.
- La final închizi fișierele cu `fin.close()` și `fout.close()`.

## Deschiderea fișierelor

```cpp
#include <fstream>
ifstream fin("bac.in");
ofstream fout("bac.out");
```

`ifstream` = fișier de INTRARE (citire), `ofstream` = fișier de IEȘIRE (scriere). Se folosesc exact ca `cin` și `cout`.

## Citirea unui număr necunoscut de valori

Tiparul fundamental de BAC (citește până la sfârșitul fișierului):

```cpp
int x;
while (fin >> x) {
    // prelucrează x
}
```

Expresia `fin >> x` devine falsă când nu mai există valori: bucla se oprește singură.

## Exemplu complet: maximul din fișier

Fișierul `bac.in` conține numere naturale separate prin spații.

```cpp
#include <fstream>
using namespace std;
int main() {
    ifstream fin("bac.in");
    ofstream fout("bac.out");
    int x, maxim = -1;
    while (fin >> x)
        if (x > maxim) maxim = x;
    fout << maxim;
    fin.close();
    fout.close();
    return 0;
}
```

Pentru conținutul `3 17 5 9`, fișierul de ieșire va conține `17`.

## Tipare frecvente la BAC

1. **numărare cu proprietate**: contor incrementat în while;
2. **ultimele două valori citite**: reții `prec` și `curent`, actualizezi în ordine;
3. **valori distincte consecutive**: compari fiecare valoare cu precedenta.

> [!ATENTIE]
> La problema "ultimele două numere", actualizarea corectă e: `prec = curent; curent = x;` în ACEASTĂ ordine. Inversarea pierde valoarea.

## Greșeli frecvente

1. Numele fișierului din enunț trebuie respectat literal ("bac.in", nu "date.in").
2. Nu citi cu `cin` când enunțul cere fișier: la BAC se depunctează.
3. `while (!fin.eof())` poate procesa ultima valoare de două ori: folosește `while (fin >> x)`.
