将数据读取到动态缓冲区序列中,直到它包含指定的定界符。
template< typename SyncReadStream, typename DynamicBuffer_v2> std::size_t read_until( SyncReadStream & s, DynamicBuffer_v2 buffers, char delim, constraint_t< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value > = 0);
此函数用于将数据读取到指定的动态缓冲区序列中,直到动态缓冲区序列的 get 区域包含指定的定界符。调用将阻塞,直到以下条件之一成立:
此操作通过对流的 read_some 函数进行零次或多次调用来实现。如果动态缓冲区序列的 get 区域已包含定界符,则函数会立即返回。
要从中读取数据的流。类型必须支持 SyncReadStream 概念。
将要读取数据的动态缓冲区序列。
定界符字符。
动态缓冲区序列的 get 区域中包含定界符(包括定界符本身)的字节数。
失败时抛出。
在成功的 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
操作提取。