Von einem Stream in einen anderen kopieren
-
Ich habe einen Eingabestream (stringstream) und einen Ausgabestream (beliebiger ostream). Die Eingabe soll komplett auf die Ausgabe kopiert werden und da die Operation recht häufig aufgerufen wird, hab ich mich gefragt, was die schnellste Variante ist.
- ostream.write()
- std::copy() (wahrscheinlich ehr nicht ??)
- irgendwas anderes?
ostream << istream.rdbuf()hat irgendwie keine Ausgabe bewirkt, obwohl laut Doku http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt alles soweit i.O. ist.
-
iostreamer schrieb:
std::copy() (wahrscheinlich ehr nicht ??)
Du wirst erstaunt sein, das ist gar nicht so langsam.
std::istreambuf_iterator<char> b(istream), e; std::copy(b, e, std::ostream_iterator<char>(ostream));Ich würde allerdings deine Variante mit rdbuf() verwenden, die sollte eigentlich funktionieren.
-
err, ostreambuf_iterator
-
Hallo iostreamer,
ob nachfolgendes die schnellste Variante ist, weiß ich nicht, aber mit die einfachste:
// Ich habe einen Eingabestream (stringstream) ... stringstream eingabestream; eingabestream << "egal" << (4+38) << " Pi=" << acos(-1.0) << endl; // ... und einen Ausgabestream (beliebiger ostream). ... ostream ausgabestream( cout.rdbuf() ); // ... Die Eingabe soll komplett auf die Ausgabe kopiert werden ausgabestream << eingabestream.rdbuf();Ausgabe:
egal42 Pi=3.14159Gruß
Werner
-
Danke für die Antworten...
wahrscheinlicheherschon schrieb:
Du wirst erstaunt sein, das ist gar nicht so langsam.
Ich habe noch nie in eine STL - Implementation reingeschaut, aber kann es sein, dass die Streamiteratoren dann vieleicht Zugriff auf die interne Repräsentation haben?
wahrscheinlicheherschon schrieb:
Ich würde allerdings deine Variante mit rdbuf() verwenden, die sollte eigentlich funktionieren.
Werner Salomon schrieb:
Hallo iostreamer,
ob nachfolgendes die schnellste Variante ist, weiß ich nicht, aber mit die einfachste:
// Ich habe einen Eingabestream (stringstream) ... stringstream eingabestream; eingabestream << "egal" << (4+38) << " Pi=" << acos(-1.0) << endl; // ... und einen Ausgabestream (beliebiger ostream). ... ostream ausgabestream( cout.rdbuf() ); // ... Die Eingabe soll komplett auf die Ausgabe kopiert werden ausgabestream << eingabestream.rdbuf();Ausgabe:
egal42 Pi=3.14159Gruß
WernerWie gesagt, die rdbuf() - Variante mag nich und mir ist noch nicht klar, warum das so ist ^^
-
iostreamer schrieb:
Wie gesagt, die rdbuf() - Variante mag nich und mir ist noch nicht klar, warum das so ist ^^
was bedeutet 'mag nicht' im Detail? - welche Entwicklungsumgebung benutzt Du?
Sollte gehen, ist Standard.
Gruß
Werner