Ce face std::cerr
Un program are două ieșiri: ieșirea standard (std::cout) și ieșirea de eroare. std::cerr scrie pe cea de eroare, fără buffer, deci mesajul apare imediat, chiar dacă programul se oprește brusc după aceea.
std::clog scrie tot pe ieșirea de eroare, dar cu buffer, ca std::cout. Este gândit pentru mesaje de jurnal (log) care nu trebuie să ajungă instant.
Separarea contează când rezultatul programului este salvat într-un fișier: ./program > rezultat.txt pune în fișier doar ce vine din std::cout, iar erorile rămân vizibile în consolă. Pe această pagină, textul de pe canalul de eroare este afișat după ieșirea normală, pentru că cele două canale sunt colectate separat.
Exemple
Exemplul 1: Rezultat pe cout, eroare pe cerr
#include <iostream>
int main() {
int stoc = 0;
std::cout << "Comanda nr. 1024\n";
if (stoc == 0) {
std::cerr << "Eroare: produsul nu mai este pe stoc\n";
}
}
Rezultat
Comanda nr. 1024
Eroare: produsul nu mai este pe stoc
Exemplul 2: Mesaje de jurnal cu clog
std::clog e potrivit pentru urmărirea pașilor programului; mesajele merg tot pe canalul de eroare. Pe această pagină apar după rezultat, pentru că cele două canale sunt colectate separat; într-un terminal, ar apărea în ordinea scrierii.
#include <iostream>
int main() {
std::clog << "[jurnal] pornesc calculul\n";
int total = 0;
for (int pret : {20, 35, 45}) {
total += pret;
}
std::clog << "[jurnal] gata\n";
std::cout << "Total: " << total << " lei\n";
}
Rezultat
Total: 100 lei
[jurnal] pornesc calculul
[jurnal] gata
Greșeli frecvente
- Scrii erorile în
std::cout: când rezultatul este redirecționat într-un fișier, mesajele de eroare ajung amestecate cu datele și nu le mai vede nimeni. - Te aștepți ca mesajele din
std::coutșistd::cerrsă apară mereu în ordinea scrierii. Fiind canale separate (unul cu buffer, altul fără), ordinea poate diferi când ieșirile sunt redirecționate.
Comenzi înrudite
std::cout: Afișează text și valori în consolă, cu operatorul <<.std::endl: Trece pe rândul următor și golește bufferul; std::flush doar golește bufferul.std::print: Afișează text formatat cu acolade {}, fără rând nou la final (C++23).