std::cerr Ausgabe im Programm ziwschenspeichern.



  • Hallo,

    folgendes Szenario:
    Erstellt wird eine Software, die auch Bausteinen anderer Entwickler aufsetzt, die gerne mal eine Fehlermeldung auf std::cerr ausgeben.
    Ich möchte die Fehlermeldungen jedoch später ggf. mal auf einer GUI ausgeben. Daher würde ich gerne alles was über std::cerr rausgeht zeilenweise speichern (in einem std::vectorstd::string > oder so). Was ich nicht möchte, ist den gesamten Quellcode anderer Entwickler zu verändern.

    Kann man das mit Bordmitteln oder mit boost einfach realisieren? Hat jemand Vorschläge?

    Gruß P.



  • Ist es eine sinnvolle Idee, den Buffer des cerr in einen Buffer eines stringstreams umzuleiten, um o.g. zu erreichen`?


  • Mod

    Das sollte so funktionieren, praktisch habe ich es aber noch nicht ausprobiert: Du baust deinen eigenen streambuf (also von streambuf erben und die nötigen Funktionen implementieren), dieser speichert die Meldungen in deinem Vector. Diesen streambuf verbindest du mit cerr und das sollte dann auch schon funktionieren.



  • Es funktioniert auch ohne Ableitung von streambuf, nämlich einfach den Buffer umlenken:

    // own buffers for cout and cerr output
    std::ostringstream ostrErr, ostrOut;
    std::streambuf *pErrBuffer = std::cerr.rdbuf(ostrErr.rdbuf());
    std::streambuf *pOutBuffer = std::cout.rdbuf(ostrOut.rdbuf());
    
    //... call other functions which write to cout and/or cerr
    
    // reset buffers to old streams
    std::cerr.rdbuf(pErrBuffer);
    std::cout.rdbuf(pOutBuffer);
    

    Die Ausgabe steht nun in den stringstream-Objekten, d.h.

    std::string sErr = ostrErr.str();
    std::string sOut = ostrOut.str();
    

    Und diese kannst du dann auch noch zeilenweise in einen vector<string> schieben.

    Möchtest du jedoch on-the-fly die Ausgabe verfolgen, dann wirst du doch von streambuf ableiten müssen und die einzelnen Ausgaben direkt abfangen.


Anmelden zum Antworten