stream filtern



  • hallo,

    gibt es eine möglichkeit einen stream (zb ostringstream) zeichenweise zu filtern?
    ich will immer dann wenn ein std::endl im stream auftaucht die daten weiterreichen und den streambuffer leeren, und zwar sofort wenn das std::endl geschrieben wird.
    konkret geht es darum das cout mit rdbuf() auf einen eigenen stream umgebogen wurde und ich die eingehenden daten unmittelbar weiterverarbeiten will. also nicht irgendwann später mit .str() rumfummeln.

    wie geht das? helfen hier traits weiter?



  • Was meinst du mit umgeleitet?

    endl taucht bestimmt nicht im Stream selber auf. Das ist ein Manipulator, der erst ein '\n' schreibt und anschließend den Streambuffer flusht (was bewirkt, daß die Daten aus dem internen Zwischenspeicher weitergeschickt werden an denjenigen, der sie verarbeiten will (bei cout normalerweise der Monitor, bei einem fstream die Festplatte etc)).



  • CStoll schrieb:

    Was meinst du mit umgeleitet?

    std::ostringstream mycout;
    std::cout.rdbuf(mycout.rdbuf());  // cout schreibt ab sofort in mycout
    
    std::cout << "hello" << std::endl;  // 1
    std::cout << "world" << std::endl;  // 2
    
    whatever(mycout.str());  // str()=="hello\nworld\n"
    

    ich will bei markierung 1 und markierung 2 "automatisch" benachrichtigt werden das was in den stream geschrieben wurde, so dass ich mir den expliziten aufruf von whatever sparen kann und darf.



  • Da müsstest du vermutlich einen speziellen Stream-Buffer schreiben, und dort Methode virtual int sync(); (die wird immer dann aufgerufen, wenn der übergeordnete Stream einen flush auslöst) überschreiben.



  • funktioniert, danke


Anmelden zum Antworten