public member function
<istream> <iostream>

std::istream::readsome

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

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

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

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

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

参数

s
指向存储提取字符的数组的指针。
n
要提取的最大字符数。
streamsize 是一个带符号整型。

返回值

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

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

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

数据竞争

修改 s 指向的数组中的元素以及流对象。
对同一流对象的并发访问可能导致数据竞争,除了标准流对象 cin 在其与 stdio 同步时。在这种情况下,不会发生数据竞争,尽管不保证提取的字符将归属到哪个线程。

异常安全

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

另见