std::cerr în C++

Scrie mesaje de eroare și de jurnal pe canalul de eroare, separat de ieșirea normală.

Sintaxă
#include <iostream>
std::cerr << mesaj;
std::clog << mesaj;

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 și std::cerr să 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).