std::cerr



  • Hallo...
    Um Fehler auszugeben nutzt man ja normalerweise std::cerr stadt cout... Meine Frage wäre jetzt, warum... Hat das irgendwelche Vorteile? (kann man die Ausgabe irgendwie danach durchsuchen oder filtern?)

    Danke schon mal...
    Bye Tom



  • Ja, man kann die Ausgabestreams in diversen Shells umleiten oder filtern.

    Wie genau man die einzelnen Umleitet weiß ich jetzt aber genau nicht^^



  • Erstens arbeitet cerr ungepuffert (nützlich z.B. wenn du auf der Suche nach einem Komplett-Absturz bist) - und zweitens landen cout und cerr/clog auf verschiedenen Ausgabekanälen, auch wenn das System beide wieder zum Monitor zusammenfasst. Wenn du dein Programm aus der Eingabeaufforderung startest, kannst du die Ausgaben jede für sich umleiten:

    mein_prog > out.txt >2 log.txt
    

    (cout-Ausgaben landen in out.txt, cerr und clog in log.txt)



  • CStoll schrieb:

    mein_prog > out.txt >2 log.txt
    

    (cout-Ausgaben landen in out.txt, cerr und clog in log.txt)

    Danke 🙂
    Du hattest übrigens nen Tipfehler drin:

    mein_prog > out.txt 2> log.txt
    

    Kann man das auch iwie im Quellcode an sich festlegen?



  • Klar, man benutzt es einfach nicht sondern stattdessen selbst erstellte Streams. 😉



  • hmmm... OK - das war zu einfach ^^ Aber eben gleichzeitig auch ziemlich aufwendig -.- Ich geh doch jz ne jede Datei einzeln durch (gibt zwar alles ersetzen aber das gilt ja immer nur in der einen Datei -.-)

    btw (damit er (wenn ich in versch. Threads was ausgeben lasse), das nicht iwie mischt):
    WaitForSingleObject (free_out, INFINITE);
    cout << "asd" << endl;
    SetEvent (free_out);

    Kann man iwie umgehen, dass bei jedem mal wieder schreiben zu müssen? Wenn nicht, dann werd ich wo wirklich nen eigenen Stream nutzen müssen : /

    Danke



  • Dann hau nicht immer ein festverdrahtetes "cout" bzw "cerr" in deinen Quellcode sondern führe beispielsweise in deinen Objekten, KLassen (static) oder namespaces Referenzen oder Zeiger auf einen oder mehrere verschiedene Ausgabestreams. Die kannst du dann je nach Bedarf an clog, cerr, cout oder beispielsweise einen fstream binden, so dass die Ausgaben deiner Objekte dann an den entsprechenden Stream gehen, den du eingestellt hast.



  • Du kannst auch cerr einen belieben rdbuf verpassen, z.B. einen von einem fstream.



  • genauer gesagt arbeitet std::cerr nicht ungepuffert. und wenn man ihm den rdbuf eines fstreams übergibt: auch mit dem streambuf von z.b. cout wird es den anschein haben, als verhielte sich cerr ungepuffert.

    das liegt daran, dass in seinen fmtflags das flag "unitbuf" gesetzt ist, welches bewirkt, dass der streambuf nach jeder ausgabeoperation geflusht wird.


Log in to reply