# Scrierea în fișiere și prelucrări cu două fișiere

> Pagina: https://bacalaurescu.ro/informatica/lectii/fisiere-text/scrierea-si-doua-fisiere
> Markdown: https://bacalaurescu.ro/informatica/lectii/fisiere-text/scrierea-si-doua-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

Tiparul citește-filtrează-scrie și numărarea valorilor pe criterii.

## Pe scurt pentru BAC

- `ofstream` creează fișierul de ieșire sau îl golește dacă există deja, iar scrierea se face identic cu `cout`.
- Tiparul de bază este citește, filtrează, scrie: în bucla `while (fin >> x)` scrii în `fout` doar valorile care respectă condiția.
- Maximul și numărul lui de apariții se află într-o singură parcurgere: la o valoare mai mare pui `nr = 1`, la egalitate crești `nr`.
- Fișierele pot avea până la un milion de valori, iar prelucrarea din mers, fără vector, folosește O(1) memorie, argument de eficiență la subiectul III.

## Scrierea într-un fișier

```cpp
ofstream fout("rezultat.out");
fout << suma << "\n";
fout.close();
```

`ofstream` creează fișierul (sau îl golește dacă există). Se folosește identic cu `cout`.

## Tiparul fundamental: citește → filtrează → scrie

Cerință tip: "în bac.out scrieți numerele PARE din bac.in, separate prin spațiu".

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

## Variațiile care apar la examen

**1. Maxim + de câte ori apare** (o singură parcurgere):

```cpp
int x, maxim = -2000000000, nr = 0;
while (fin >> x) {
    if (x > maxim) { maxim = x; nr = 1; }
    else if (x == maxim) nr++;
}
fout << maxim << " " << nr;
```

**2. Media valorilor pozitive**: sumă + contor doar pe pozitive, la final `(double)s / n` cu verificarea `n > 0`.

**3. Transfer cu transformare**: fiecare număr citit se scrie modificat (dublat, fără ultima cifră etc.): aceeași buclă, altă expresie la scriere.

## De ce nu "încarci tot în vector"

Fișierele de BAC pot avea până la un milion de valori: prelucrarea DIN MERS (fără memorare) e cerută explicit la multe subiecte ("eficient din punct de vedere al memoriei"). Tiparele de mai sus folosesc O(1) memorie: argumentul de eficiență cerut la subiectul III.

> [!RETINE]
> Structura oricărei probleme cu fișiere: deschide ambele → while (fin >> x) cu prelucrarea → scrie pe parcurs sau la final → close. Memorie O(1) = mentionează explicit la justificarea eficienței.

## Greșeli frecvente

1. ofstream pe fișierul de INTRARE îl golește: verifică de două ori numele.
2. Maximul inițializat cu 0 pică pe fișiere doar cu negative: folosește o valoare-santinelă foarte mică.
3. La medie, împărțirea întreagă și împărțirea la 0 sunt ambele depunctate: (double) și if (n > 0).
