Я бы хотел скопировать данные эффективно между std::streambuf
экземпляров. То есть, я хотел бы сгребать блоки данных между ними, а не выполнять копирование по одному символу. Например, это не то, что я ищу:Блочное копирование данных между потоковыми буферами
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Там существует синтаксический сахар для этого, с немного больше контроля ошибок:
ostream os{&out};
os << ∈
Вот фрагмент реализации operator<<(basic_streambuf<..>*)
в моей стандартной библиотеки (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;
}
Суть: это по-прежнему за характер копирования. Я надеялся, что стандартная библиотека использует алгоритм, который опирается на функции-элементы уровня блока потоковых буферов, sputn
и sgetn
, в отличие от транспорта на один символ. Предоставляет ли стандартная библиотека такой алгоритм, или мне нужно сворачивать самостоятельно?
Проблема заключается в том, что это основано на интерфейс с виртуальными функциями. Вы никогда не знаете, когда '* __ o = * __ i' не будет выводиться, поэтому вы не можете читать дальше и рискуете потерять эти символы. –
Вы нашли способ? – barney