读取数据到动态缓冲区序列,直到其中包含指定的定界符。
template< typename SyncReadStream, typename DynamicBuffer_v1> std::size_t read_until( SyncReadStream & s, DynamicBuffer_v1 && buffers, char delim, constraint_t< is_dynamic_buffer_v1< decay_t< DynamicBuffer_v1 > >::value > = 0, constraint_t< !is_dynamic_buffer_v2< decay_t< DynamicBuffer_v1 > >::value > = 0);
此函数用于将数据读取到指定的动态缓冲区序列,直到该动态缓冲区序列的获取区域包含指定的定界符。调用将阻塞,直到以下条件之一为真
此操作通过零次或多次调用流的 read_some 函数来实现。如果动态缓冲区序列的获取区域已经包含定界符,则该函数立即返回。
从中读取数据的流。类型必须支持 SyncReadStream 概念。
数据将要读取到的动态缓冲区序列。
定界符字符。
动态缓冲区序列的获取区域中,直到并包括定界符的字节数。
失败时抛出。
在成功的 read_until 操作之后,动态缓冲区序列可能包含超出定界符的额外数据。应用程序通常会将该数据留在动态缓冲区序列中,以供后续的 read_until 操作检查。
要将数据读取到 std::string
中,直到遇到换行符
std::string data; std::size_t n = boost::asio::read_until(s, boost::asio::dynamic_buffer(data), '\n'); std::string line = data.substr(0, n); data.erase(0, n);
在 read_until
操作成功完成后,字符串 data
包含定界符
{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }
然后调用 substr
提取直到并包括定界符的数据,以便字符串 line
包含
{ 'a', 'b', ..., 'c', '\n' }
在调用 erase
之后,剩余数据将留在缓冲区 b
中,如下所示
{ 'd', 'e', ... }
此数据可能是新行的开始,将由后续的 read_until
操作提取。