Прочитайте данные в streambuf, пока некоторая часть данных, которые он содержит, не совпадет с обычным выражением.
template<
typename SyncReadStream,
typename Allocator>
std::size_t read_until(
SyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
const boost::regex & expr);
Эта функция используется для считывания данных в указанный streambuf до тех пор, пока область получения streambuf не содержит некоторые данные, которые соответствуют обычному выражению. Звонок будет блокироваться до тех пор, пока не будет выполнено одно из следующих условий:
- Подстрочник зоны получения стримбуфа соответствует обычному выражению.
- Произошла ошибка.
Эта операция реализована с точки зрения нуля или более вызовов функции read_some потока. Если область получения Streambuf уже содержит данные, соответствующие обычному выражению, функция немедленно возвращается.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию SyncReadStream.
- b
Объект streambuf, в который будут считываться данные.
- expr
Регулярное выражение.
Количество байтов в зоне доступа Streambuf и включая подстроку, которая соответствует обычному выражению.
- boost::system::system_error
Выброшен на провал.
После успешной операции read_until, streambuf может содержать дополнительные данные, не соответствующие обычному выражению. Приложение, как правило, оставляет эти данные в streambuf для последующего чтения до тех пор, пока операция не будет изучена.
Для считывания данных в streambuf до появления последовательности CR-LF:
boost::asio::streambuf b;
boost::asio::read_until(s, b, boost::regex("\r\n"));
std::istream is(&b);
std::string line;
std::getline(is, line);
После успешного завершения операции<read_until
>буфер<b
>содержит данные, соответствующие обычному выражению:
{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }
Звонок в<std::getline
>затем извлекает данные до и включая совпадение, так что строка<line
>содержит:
{ 'a', 'b', ..., 'c', '\r', '\n' }
Остальные данные оставляют в буфере<b
>следующим образом:
{ 'd', 'e', ... }
Эти данные могут быть началом новой линии, которая будет извлечена последующей операцией<read_until
>.