@sehe имеет отличный ответ, который позволяет останавливаться на EOF или когда считывается определенное количество байтов. Мои версии немного сложнее, но дополнительно позволяют останавливаться на любом разделителе.
Вы можете construct ваше подталкивание :: ASIO :: streambuf с максимальным размером аргументом:
Конструктор basic_streambuf принимает size_t аргумент, указывающий максимум суммы размеров входного последовательности и выходной последовательности. Во время жизни объекта basic_streambuf, следующий инвариант имеет место
size() <= max_size()
Любая функция-член, которая, в случае успеха, привести инвариант нарушаться брошу исключение класса станд :: length_error.
Или вы могли бы использовать эту перегрузку:
template<
typename SyncReadStream,
typename Allocator,
typename MatchCondition>
std::size_t read_until(
SyncReadStream & s,
boost::asio::basic_streambuf<Allocator> & b,
MatchCondition match_condition,
boost::system::error_code & ec,
typename enable_if< is_match_condition<MatchCondition>::value >::type * = 0);
где функция условия матча выглядит примерно так:
using iterator = buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>;
/**
\brief Make read_until stop when either:
* the stop character was found
* more than 100MB have been read
*/
pair<iterator, bool> match_condition(iterator begin, iterator end) {
// to much data?
if(end - begin > 100*1024*1024) {
return std::make_pair(begin, true);
}
// try and find stop character
for(auto i = begin; i < end; i++) {
auto c = i.rdbuf()->sgetc();
if(c == STOP_CHARACTER) {
return std::make_pair(i, true);
}
}
return std::make_pair(begin, false);
}
(Making этой работа с несколькими символами разделителями в оставляются в качестве упражнение для читателя)
Это хорошо, но очень сложно, IYAM (см. Мой ответ) – sehe
@если вы правы, я немного его отредактировал. Я использовал его для проверки «\ r \ n», поэтому я думал, что OP означает фактические буквы «<», «E», «O», «F», «>» и написал мой ответ с учетом этого. – user45891
На самом деле , это правильный способ прочитать вопрос. Не беспокойтесь, в этом случае это лучший ответ.+1 – sehe