public member function
<istream> <iostream>

std::basic_istream::readsome

streamsize readsome (char_type* s, streamsize n);
从流中读取可用的数据
从流中提取最多 n 个字符并存储在 s 指向的数组中,一旦与 关联的流缓冲区对象(如果有)的内部缓冲区中的字符用完,提取就会停止,即使尚未到达文件尾

此函数旨在用于从某些类型的异步源读取数据,这些源可能会等待更多字符,因为它在内部缓冲区用尽时立即停止提取字符,从而避免潜在的延迟。

请注意,此函数依赖于与流关联的特定流缓冲区对象的内部实现,对于标准类而言,其行为在很大程度上是实现定义的。

在内部,该函数首先创建一个 sentry 对象(将 noskipws 设置为 true)来访问输入序列。然后(如果 good),它通过调用其成员函数 in_avail 来检查与流缓冲区对象关联的当前有多少字符可用,并通过调用 sbumpc(或 sgetc)来提取多达该数量的字符。最后,它销毁 sentry 对象,然后返回。

通过调用成员函数 gcount 可以访问此函数成功读取并存储的字符数。

参数

s
指向存储提取字符的数组的指针。
成员类型 char_type 是流使用的字符类型(即其第一个类模板参数 charT)。
n
要提取的最大字符数。
streamsize 是一个带符号整型。

返回值

存储的字符数。
streamsize 是一个带符号整型。

错误通过修改内部状态标志来指示
flagerror
eofbit输入序列没有可用的字符(由 rdbuf()->in_avail() 返回 -1 报告)。
failbit构造 sentry 失败(例如,当调用前的 *流状态* 不是 good 时)。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
设置时,流的完整性可能已受到影响。
一次操作可能设置多个标志。

如果操作设置了已向成员 exceptions 注册的内部状态标志,则该函数将抛出其成员类型为 failure 的异常。

数据竞争

修改 s 指向的数组中的元素以及流对象。
对同一流对象的并发访问可能会导致数据争用,但标准流对象 cinwcin与 stdio 同步时除外(在这种情况下,不会引发数据争用,尽管对于提取的字符归属给线程的顺序没有保证)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果结果错误状态标志不是 goodbit 并且成员 exceptions 被设置为针对该状态抛出,则会抛出其成员类型为 failure 的异常。
任何由内部操作抛出的异常都会被函数捕获和处理,并设置 badbit。如果对 exceptions 的最后一次调用设置了 badbit,则函数将重新抛出捕获的异常。

另见