Ich möchte Daten effizient zwischen std::streambuf
Instanzen kopieren. Das heißt, ich möchte Blöcke von Daten zwischen ihnen schaufeln, im Gegensatz zu zeichenweisem Kopieren. Zum Beispiel ist dies nicht was ich suche:Block-Level-Kopieren von Daten zwischen streambuffers
ostream os{&out};
os << ∈
Hier ist ein Ausschnitt aus der Umsetzung von operator<<(basic_streambuf<..>*)
:
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Es hierfür mit etwas mehr Fehlerprüfung syntaktischen Zucker vorhanden ist in meiner Standard-Bibliothek (Mac OS X, XCode 7):
typedef istreambuf_iterator<_CharT, _Traits> _Ip;
typedef ostreambuf_iterator<_CharT, _Traits> _Op;
_Ip __i(__sb);
_Ip __eof;
_Op __o(*this);
size_t __c = 0;
for (; __i != __eof; ++__i, ++__o, ++__c)
{
*__o = *__i;
if (__o.failed())
break;
}
Unterm Strich: Das ist nach wie vor pro-Charakter Kopieren. Ich hatte gehofft, dass die Standard-Bibliothek einen Algorithmus verwendet, der auf den Block-Level-Member-Funktionen der Stream-Puffer, sputn
und sgetn
, im Gegensatz zu pro-Zeichen-Transport beruht. Bietet die Standardbibliothek einen solchen Algorithmus oder muss ich meinen eigenen erstellen?
Das Problem fehlschlagen ist, dass diese auf einer Schnittstelle mit virtuellen Funktionen basieren. Sie wissen nie, wann '* __ o = * __ i' nicht ausgegeben werden kann, Sie können also nicht vorauslesen und riskieren, diese Zeichen zu verlieren. –
Haben Sie die Methode gefunden? – barney