2013-03-26 8 views
9

Wenn ich ein std::ostringstream Objekt namens oss habe, verstehe ich, ich kann std::cout << oss.str() tun, um die Zeichenfolge auszudrucken. Aber oss.str() würde dazu führen, dass die zurückgegebene Zeichenfolge kopiert wird. Gibt es eine Möglichkeit, direkt den zugrunde liegenden streambuf zu drucken?Wie schreibe ich ostringstream direkt zu cout

Vielen Dank im Voraus!

Antwort

9

Nicht, wenn Sie std::ostringstream verwenden. Der zugrunde liegende Puffer dafür kann nicht gelesen werden (daher die o in ostringstream), so dass Sie sich auf die Implementierung verlassen müssen, um es für Sie zu tun, über str().

Wenn Sie jedoch std::stringstream (man beachte das Fehlen von o) verwenden, dann ist die zugrunde liegende Puffer lesbar ist, und basic_ostream ‚s haben eine besondere Überlastung ForReading von Puffern:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream ss1; 
    ss1 << "some " << 111605 << " stuff" << std::flush; 

    std::cout << ss1.rdbuf() << std::endl; 
    std::cout << ss1.str() << std::endl; 
} 

Ausgang:

einige 111.605 Sachen
einige 111.605 Sachen

(Example derived from here.)

Dies kopiert direkt aus dem zugrunde liegenden Puffer, ohne eine Zwischenkopie.

+0

Danke! Deine Lösung funktioniert. Ich fand auch diesen Beitrag http://stackoverflow.com/questions/10009809/query-stdostringstream-content/10010160#10010160 wo ostream verwendet wird, um das gleiche zu erreichen. Ich habe mich nur gefragt, was ist der Unterschied zwischen der Verwendung von Ostream und Stringstream. welcher ist leistungsfähiger? –

+0

@WinstonHuang: Sie müssen es profilieren, um herauszufinden, welche performanter ist. Ich bezweifle, dass es schneller geht, und es ist sicherlich komplizierter als nur 'std :: stringstream' zu verwenden. – GManNickG