C++ Kurs

Wenn fertig, bitte Fenster schließen

cerr und clog

cerr und clog sind, genauso wie cout, Streams, die standardmäßig ihre Ausgaben auf die Standardausgabe ausgeben. Auch sie liegen im std-Namensraum. Überall wo Sie bisher den Ausgabestream cout verwendet haben, könnten Sie statt dessen auch den Ausgabestream cerr bzw. clog einsetzen.

Vielleicht fragen Sie sich nun, warum es dann diese zusätzlichen Streams überhaupt gibt? Nun, wie aus den Namen der Streams ersichtlich ist, sind diese Streams für die Ausgabe von besonderen Meldungen gedacht. So ist der Stream cerr für die Ausgabe von Fehlermeldungen gedacht und clog für die Ausgabe von irgend welchen Kontrollausgaben, wie z.B. Meldungen zur Verfolgung des Programmablaufs. Der Stream cerr besitzt gegenüber cout und clog jedoch einen kleinen Unterschied: die Ausgabe erfolgt hier ungepuffert, d.h. direkt die Ausgabe erfolgt direkt auf die Standardausgabe ohne den Umweg über einen Ausgabepuffer.


#include <iostream>
#include <fsream>

int main ()
{
   // cerr Ausgabe auf Datei umleiten
   std::ofstream out("test.err");
   std::streambuf* sbuf = std::cerr.rdbuf();
   std::cerr.rdbuf(out.rdbuf());

   // Ausgabe in cerr und clog Stream
   std::cerr << "cerr Ausgabe" << std::endl;
   std::clog << "clog Ausgabe" << std::endl;


   // Umleitung unbedingt wieder aufheben!
   std::cerr.rdbuf(sbuf);
}

Wie bereits erwähnt, erfolgen die Ausgaben genauso auf der Standardausgabe wie cout Ausgaben. Im Beispiel oben (das Sie jetzt noch nicht komplett verstehen müssen um es anzuwenden) können Sie sich nun einmal ansehen, wie z.B. die Ausgabe des cerr Streams in die Datei test.err umgeleitet wird. Das Prinzip bei dieser Ausgabeumleitung, die übrigens genauso für den Ausgabestream clog und sogar für cout funktioniert, besteht darin, für die cerr Ausgabe den Ausgabepuffer eines Dateistreams einzusetzen. Mehr zu den Dateistreams aber später im Kurs noch.

Beachten Sie wieder, wo überall der Namensraum std angegeben werden muss. Das obige Programm kommt ohne using-Anweisung aus.