Прочитайте данные в streambuf до тех пор, пока они не будут содержать определенный разграничитель.
template<
typename SyncReadStream,
typename Allocator>
std::size_t read_until(
SyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
const std::string & delim);
Эта функция используется для считывания данных в указанный streambuf до тех пор, пока область получения streambuf не содержит указанный делимитер. Звонок будет блокироваться до тех пор, пока не будет выполнено одно из следующих условий:
- Зона получения Streambuf содержит указанный делимитер.
- Произошла ошибка.
Эта операция реализована с точки зрения нуля или более вызовов функции read_some потока. Если область получения Streambuf уже содержит разграничитель, функция немедленно возвращается.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию SyncReadStream.
- b
Объект streambuf, в который будут считываться данные.
- delim
Струна разграничителя.
Количество байтов в зоне доступа Streambuf до и включая разграничитель.
- boost::system::system_error
Выброшен на провал.
После успешной операции read_until, streambuf может содержать дополнительные данные за пределами разграничителя. Приложение обычно оставляет эти данные в streambuf для последующего чтения до тех пор, пока операция не будет изучена.
Для чтения данных в streambuf до появления новой строки:
boost::asio::streambuf b;
boost::asio::read_until(s, b, "\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
>.