Vorrei copiare i dati in modo efficiente tra std::streambuf
istanze. Cioè, mi piacerebbe spalare blocchi di dati tra di loro, al contrario di eseguire la copia carattere per carattere. Ad esempio, questo è non quello che sto cercando:Copia a livello di blocchi di dati tra streambands
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Esiste zucchero sintattico per questo, con un po 'più di controllo degli errori:
ostream os{&out};
os << ∈
Ecco un frammento della realizzazione di operator<<(basic_streambuf<..>*)
nella mia libreria standard (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;
}
La linea di fondo è: questo è ancora a livello di carattere copia. Speravo che la libreria standard utilizzasse un algoritmo che si basa sulle funzioni dei membri a livello di blocco degli streambuffer, sputn
e sgetn
, anziché sul trasporto per carattere. La libreria standard fornisce un tale algoritmo o devo eseguire il rollover?
Il problema è che questo è basato su un'interfaccia con funzioni virtuali. Non si sa mai quando '* __ o = * __ i' non verrà stampato, quindi non si può leggere avanti e rischiare di perdere quei caratteri. –
hai trovato il metodo? – barney