Sari la conținut
LECȚIA 13.2 · INFORMATICĂ

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

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

Conținut verificat

Scrierea într-un fișier

Scrierea intr-un fisier
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    int suma = 42;
    ofstream fout("rezultat.out");
    fout << suma << "\n";
    fout.close();

    ifstream verificare("rezultat.out");
    int x;
    verificare >> x;
    cout << x;
    return 0;
}
se trimit programului la citire

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".

Doua fisiere: citire si scriere
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ofstream pregatire("bac.in");
    pregatire << "5 8 3 12 7 4";
    pregatire.close();

    ifstream fin("bac.in");
    ofstream fout("bac.out");
    int x;
    while (fin >> x)
        if (x % 2 == 0)
            fout << x << " ";
    fin.close();
    fout.close();

    ifstream citire("bac.out");
    string linie;
    getline(citire, linie);
    cout << linie;
    return 0;
}
se trimit programului la citire

Variațiile care apar la examen

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

Maximul si de cate ori apare
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ofstream pregatire("bac.in");
    pregatire << "5 12 3 12 7";
    pregatire.close();

    ifstream fin("bac.in");
    ofstream fout("bac.out");
    int x, maxim = -2000000000, nr = 0;
    while (fin >> x) {
        if (x > maxim) { maxim = x; nr = 1; }
        else if (x == maxim) nr++;
    }
    fout << maxim << " " << nr;
    fin.close();
    fout.close();
    cout << maxim << " " << nr;
    return 0;
}

Atenție: Numaratorul se pune pe 1 chiar in momentul in care se gaseste un maxim nou, nu la final. In Pascal, maxim e declarat longint: tipul integer nu poate tine -2000000000 si valoarea s-ar strica prin depasire.

se trimit programului la citire

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.

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).