Unterschied zwischen 'cerr' und 'cout'



  • Moin!

    Wie der Titel schon verrät, möchte ich gerne wissen, wofür 'cerr' gut ist und was den Unterschied zwischen 'cerr' und 'cout ausmacht. Mir ist aufgefallen, dass manche Bücher und Tutorials 'cerr' gar nicht erst erwähnen.

    Was wisst ihr darüber? 🙂

    Mr. B --> Xeroxian



  • cerr ist der spezielle error stream, der wird normalerweise in eine datei umgeleitet und als fehelrlogger verwendet



  • clog gibts auch noch 🙂

    cout geht gepuffert auf die Standardausgabe
    cerr geht ungepuffert auf die Standardfehlerausgabe
    clog geht gepuffert auf die Standardfehlerausgabe

    Normalerweise ist Standardausgabe und Standardfehlerausgabe dasselbe Gerät, allerdings sind es beispielsweise unter Unix separate Streams, die sich getrennt voneinander umleiten lassen.



  • irgendein (code-)beispiel, wo man 'cerr' gut benötigt?



  • überall da wo du eine Fehlermeldung ausgeben willst

    try {
      do_something();
    }
    catch(std::exception &e) {
      std::cerr << "Error: " << e.what() << '\n';
      return 1;
    }
    


  • Mist, kingruedi war schneller...



  • ja, aber dann kann man doch auch theroretischer weise cout nehmen oder nicht?



  • ja, kann man nehmen. Aber cerr ist dafür extra geschaffe, so könnte zum Beispiel ein Anwender deines Programmes alle Fehler die du ausgibst mitloggen oder filtern lassen und die normalen Ausgaben nicht.

    Außerdem ist cerr ungepuffert im Gegensatz zu cout.



  • #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[]) 
    {
       if (argc==1) 
           cout << "Good day!" << endl;
       else 
           cerr << "I don't know what to do with " << argv[1] << endl;
    }
    
    #include <iostream>
    using namespace std;
    
    int main()
    {
          double val1, val2;
          cout << "Divide Two Values" << endl;
          cout << "Enter two numeric values: " << endl;
          cin >> val1 >> val2;
          if (val2 == 0 )
              cerr << "The second value must be non-zero" << endl;
          else
              cout << "The answer is " << val1 / val2 << endl;
    }
    

    Neben den byte-stream-Objekten cin, cout, cerr, clog gibt es noch die wide-stream-Objekte wcin, wcout, wcerr, wclog.



  • Bashar schrieb:

    allerdings sind es beispielsweise unter Unix separate Streams, die sich getrennt voneinander umleiten lassen.

    unter win zum glück auch. wie gewohnt umleitung von cout mit > und von cerr mit 2>.
    leider kann ich unter win cerr nicht in ne pipe umleiten, und das ist schon manchmal ernrm lästig, wenn "bla.exe --help" ihren hilfetext nach cerr ausgibt.



  • volkard schrieb:

    leider kann ich unter win cerr nicht in ne pipe umleiten, und das ist schon manchmal ernrm lästig, wenn "bla.exe --help" ihren hilfetext nach cerr ausgibt.

    du kannst dir doch auch unter windows ne vernünftige shell installieren. Braucht vielleicht cygwin, aber das isses wert.

    abgesehen davon, finde ich allerdings, dass ein --help nach stdout ausgeben sollte.


Log in to reply