std::cout unterdrücken?



  • Wir haben hier eine Anwendung, welche nicht dafür gemacht worden ist, generische IO Streams zu benutzen. Im Klartext: Die Anwendung müllt sd::cout zu. Man kann zwar die Menge an Output halbwegs kontrollieren, aber ich bin in der Situation, wo ich std::cout teilweise umleiten muss.

    Folgende Situation: Testanwendung benutzt Hauptanwendung. Testanwendung IO ist umleitbar zu jedem beliebigen Stream. Hauptanwendung müllt std::cout zu.
    Was ich versuche zu erreichen ist, die Ausgabe so zu modifizieren, dass std::cout nur die Ausgabe der Testanwendung zeigt.
    Ich müsste quasi std::cout generell wo anders umleiten (Datei) und den Stream der Testanwendung so anpassen, dass dieser zur Konsole geleitet wird. Testanwendung nimmt ja einen Stream, von daher ist es theoretisch möglich einen pseudo stream zu erzeugen, der cout wo anders hinbiegt. dieses "wo anders" muss nur am Ende wieder in der Konsole sein, weil es den Benutzer leitet. Daher hilft IO in Datei nicht viel


  • Mod



  • Klingt gut, aber dann habe ich noch das Problem, dass der default std::cout von dem Programm zugemüllt wird, oder?

    Ich kann ja std::cout auf einen anderen ostream verweisen und somit meine Hauptanwendung stumm machen, aber wie kommt man dann an die Konsole ran?


  • Mod

    Seikilos schrieb:

    Klingt gut, aber dann habe ich noch das Problem, dass der default std::cout von dem Programm zugemüllt wird, oder?

    Ich kann ja std::cout auf einen anderen ostream verweisen und somit meine Hauptanwendung stumm machen, aber wie kommt man dann an die Konsole ran?

    Vorsicht, ungetested, aber die Idee sollte klar sein:

    ostream *konsole = cout.tie();          // Konsolenstream merken
    cout.tie(stream_der_zugemuellt_wird);   // cout irgendwohin umleiten(z.B. nach /dev/null)
    ostream wird_nicht_zugemuellt_und_schreibt_in_die_konsole;       // Neuer ostream...
    wird_nicht_zugemuellt_und_schreibt_in_die_konsole.tie(konsole);  // ...wird an die Konsole gebunden und wird dann vom Programm verwendet
    

  • Mod

    Ok, jetzt getestet. Ich habe dabei festgestellt, das tie doch nicht das macht, was ich meinte. Richtig ist in diesem Fall rdbuf(). So geht es:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(){
      streambuf *backup;
      ofstream muell;
      muell.open ("/dev/null");
    
      backup = cout.rdbuf();     // Konsolenpuffer merken
    
      ostream konsole(backup);   // Neuen stream an Konsole binden
    
      cout.rdbuf(muell.rdbuf()); // cout auf Muell umleiten
    
      cout << "In's Nichts."<<endl;
    
      konsole << "An stdout." << endl;
    
      cout.rdbuf(backup);        // Wichtig! Am Ende cout wieder auf stdout leiten
    
      muell.close();
    
      return 0;
    
    }
    


  • Danke, werde ich alsbald testen 🙂


Anmelden zum Antworten