Chciałbym skutecznie skopiować dane między instancjami std::streambuf
. To znaczy, chciałbym przerzucić bloki danych między nimi, w przeciwieństwie do kopiowania znaków po znaku. Na przykład, jest to nie co szukam:Kopiowanie danych na poziomie bloków między streiabossami
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Istnieje cukier syntaktyczny dla tego, z nieco więcej kontroli błędów:
ostream os{&out};
os << ∈
Oto fragment realizacji operator<<(basic_streambuf<..>*)
w mojej bibliotece standardowej (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;
}
Najważniejsze jest to: to wciąż za kopiowanie znaku. Miałem nadzieję, że standardowa biblioteka korzysta z algorytmu, który opiera się na blokowych funkcjach składowych filtrów, sputn
i sgetn
, w przeciwieństwie do transportu na znak. Czy standardowa biblioteka zapewnia taki algorytm, czy też muszę samodzielnie wykonać własną kopię?
Problemem jest to, że opiera się na interfejsie z funkcji wirtualnych. Nigdy nie wiesz, kiedy '* __ o = * __ i' nie powiedzie się, więc nie możesz czytać z wyprzedzeniem i ryzykujesz utratę tych znaków. –
znalazłeś metodę? – barney