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;
}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 deendl—endlgoleș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ș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.