std::basic_istream<CharT,Traits>::readsome
来自 cppreference.cn
< cpp | io | basic istream
std::streamsize readsome( char_type* s, std::streamsize count ); |
||
从输入流中提取最多 count 个立即可用的字符。 提取的字符存储到 s 指向的字符数组中。
行为如同 非格式化输入函数。在构造并检查 sentry 对象后,
- 若 rdbuf()->in_avail() == -1,则调用 setstate(eofbit) 且不提取字符。
- 若 rdbuf()->in_avail() == 0,则不提取字符。
- 若 rdbuf()->in_avail() > 0,则提取 std::min(rdbuf()->in_avail(), count) 个字符,并将它们存储到字符数组的连续位置,该字符数组的首元素由 s 指向。
目录 |
[编辑] 参数
s | - | 指向用于存储字符的字符数组的指针 |
count | - | 要读取的最大字符数 |
[编辑] 返回值
实际提取的字符数。
[编辑] 异常
若内部操作抛出异常,则捕获它并设置 badbit。若为 badbit
设置了 exceptions(),则重新抛出该异常。
[编辑] 注解
此函数的行为高度依赖于具体实现。例如,将 readsome()
与 std::ifstream 一起使用会导致显著的、实现相关的结果。某些库实现在 std::ifstream 打开文件后立即使用数据填充底层的 filebuf
,这意味着 readsome()
始终读取数据,甚至可能读取整个文件。在其他实现中,std::ifstream 仅在调用输入操作时才从文件读取数据,这意味着在打开文件后立即调用 readsome()
永远不会提取任何字符。 类似地,调用 std::cin.readsome() 可能会返回所有挂起、未处理的控制台输入,或者可能始终返回零且不提取任何字符。
[编辑] 示例
运行此代码
#include <cassert> #include <iostream> #include <sstream> int main() { char c[10] = "*********"; // c[9] == '\0' // std::stringbuf makes its entire buffer available for unblocking read std::istringstream input("This is sample text."); auto r = input.readsome(c, 5); // reads 'This ' and stores in c[0] .. c[4] assert(r == 5); std::cout << c << '\n'; r = input.readsome(c, 9); // reads 'is sample' and stores in c[0] .. c[8] assert(r == 9); std::cout << c << '\n'; }
输出
This **** is sample
[编辑] 参见
提取字符块 (公有成员函数) | |
获取 get 区域中立即可用的字符数 ( std::basic_streambuf<CharT,Traits> 的公有成员函数) |