Boost C++ 库

……是世界上最受推崇、设计最精湛的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, 《C++ 编码规范》

read_until (24 个重载中的第 17 个) - Boost C++ 函数库
PrevUpHomeNext

将数据读取到动态缓冲区序列中,直到它包含指定的定界符。

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 区域包含指定的定界符。调用将阻塞,直到以下条件之一成立:

  • 动态缓冲区序列的 get 区域包含指定的分隔符。
  • 发生错误。

此操作通过对流的 read_some 函数进行零次或多次调用来实现。如果动态缓冲区序列的 get 区域已包含定界符,则函数会立即返回。

参数

s

要从中读取数据的流。类型必须支持 SyncReadStream 概念。

缓冲区

将要读取数据的动态缓冲区序列。

delim

定界符字符。

返回值

动态缓冲区序列的 get 区域中包含定界符(包括定界符本身)的字节数。

异常

boost::system::system_error

失败时抛出。

备注

在成功的 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 操作提取。


PrevUpHomeNext