Scrierea rezultatelor în fișier

Bază~12 min3 pași

De ce contează?

Ai rezolvat problema, ai calculat răspunsul — acum trebuie să-l „livrezi". La concurs, graderul nu citește ecranul, citește fișierul .out. Dacă scrii cu cout fără redirecționare, rezultatul apare în terminal și dispare. Primești 0 puncte pe un algoritm corect.

Metoda 1 — ofstream (recomandată)

ofstream (output file stream) deschide fișierul și îl creează dacă nu există. Dacă există deja, îl golește și îl rescrie de la zero.

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // ... citire si calcul ...
    long long rezultat = 42;

    ofstream fout("suma.out");  // deschide (sau creaza) fisierul
    fout << rezultat << "\n";   // scrie ca si cu cout
    fout.close();               // optional: se inchide automat
    return 0;
}

Operatorul << funcționează identic cu cout << — poți scrie numere, șiruri, "\n", spații, orice.

Metoda 2 — freopen (mai scurtă)

freopen redirecționează stdout — destinația lui cout — spre un fișier. Tot codul rămas folosește cout neschimbat.

#include <iostream>
using namespace std;

int main() {
    freopen("suma.out", "w", stdout);  // redirecteaza cout spre fisier

    long long rezultat = 42;
    cout << rezultat << "\n";          // scrie in fisier automat
    return 0;
}

Programul complet — citire și scriere din fișiere

Cele două metode combinate, ca să vezi întregul flux:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream fin("suma.in");
    ofstream fout("suma.out");

    int n;
    fin >> n;

    long long suma = 0;
    for (int i = 0; i < n; i++) {
        int x;
        fin >> x;
        suma += x;
    }

    fout << suma << "\n";

    fin.close();
    fout.close();
    return 0;
}

Sau cu freopen (mai puțin cod):

#include <iostream>
using namespace std;

int main() {
    freopen("suma.in",  "r", stdin);
    freopen("suma.out", "w", stdout);

    int n;
    cin >> n;

    long long suma = 0;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        suma += x;
    }

    cout << suma << "\n";
    return 0;
}
Observația-cheie

Ambele metode produc exact același rezultat în fișier. ifstream/ofstream e mai explicită — fiecare variabilă are scopul clar, iar fin și fout nu interferează cu cin/cout. freopen e mai scurtă și convenabilă când vrei să adaptezi rapid un program existent. Alege una și folosește-o consistent.

Formatul output-ului

Graderul compară fișierul tău .out cu cel de referință caracter cu caracter (sau linie cu linie). Câteva reguli practice:

  • Un singur număr pe linie: fout << rezultat << "\n";
  • Mai multe numere pe linie, separate prin spații: fout << a << " " << b << "\n";
  • Preferă "\n" în loc de endlendl golește bufferul la fiecare apel și poate încetini programul semnificativ în bucle mari.

Citește enunțul cu atenție: uneori câte un element pe linie, uneori toate pe un rând. Un spațiu în plus sau lipsă poate face diferența dintre AC și WA.

Greșeli frecvente

Greșeala 1: Folosești "r" (read) în loc de "w" (write) la freopen pentru output. Programul încearcă să citească din stdout — comportament nedefinit.

Greșeala 2: Scrii spații sau newline-uri în plus. fout << rezultat << " " << "\n" lasă un spațiu înainte de newline — unii graderi îl acceptă, alții nu. Preferă "\n" fără nimic după ultimul element.

Greșeala 3: Calculezi corect rezultat dar scrii cout << rezultat fără freopen sau ofstream — rezultatul merge la consolă, nu în .out. Graderul nu primește nimic și acordă 0 puncte.

Întrebarea 1 / 3

Ce clasă folosești pentru a scrie într-un fișier text?