std::basic_istream<CharT,Traits>::get
来自cppreference.com
<tbody>
</tbody>
int_type get(); |
(1) | |
basic_istream& get( char_type& ch ); |
(2) | |
basic_istream& get( char_type* s, std::streamsize count ); |
(3) | |
basic_istream& get( char_type* s, std::streamsize count, char_type delim ); |
(4) | |
basic_istream& get( basic_streambuf& strbuf ); |
(5) | |
basic_istream& get( basic_streambuf& strbuf, char_type delim ); |
(6) | |
从流提取一个或多个字符。
所有版本都表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,这些函数进行下列操作:
1) 读取一个字符,如果可用就返回它。否则,返回
Traits::eof() 并设置 failbit 和 eofbit。2) 读取一个字符,如果可用就将它存储到
ch。否则,不修改 ch 并设置 failbit 和 eofbit。注意与有格式字符输入 operator>> 不同,此函数不对类型 signed char 和 unsigned char 重载。3) 同
get(s, count, widen('\n')),即读取最多 std::max(0, count - 1) 个字符并将它们存储到 s 所指向的字符串中,直到找到 '\n'。4) 读取字符并将它们存储到以
s 指向首元素的字符数组中的相继位置。提取并存储字符,直到满足下列任一条件:
count小于1或已存储count - 1个字符。- 输入序列中出现文件尾条件(调用
setstate(eofbit))。 - 下个可用输入字符
c等于delim,以Traits::eq(c, delim)确定。不会提取此字符(与getline()不同)。
任何情况下,如果
count > 0,那么将空字符(CharT())存储到数组的下个相继位置。6) 读取字符并将它们插入到给定的 std::basic_streambuf 对象所控制的输出序列。提取并插入字符到
strbuf 中,直到满足下列任一条件:
- 输入序列中出现文件尾条件。
- 插入输出序列失败(该情况下不会提取无法插入的字符)。
- 下个可用输入字符
c等于delim,以Traits::eq(c, delim)确定。不会提取此字符。 - 出现异常(该情况下捕获而不重抛异常)。
没有提取到字符时会调用 setstate(failbit)。
所有版本都设置 gcount() 的值为提取到的字符数。
参数
| ch | - | 到要写入结果到的字符的引用 |
| s | - | 指向要存储结果到的字符串的指针 |
| count | - | s 所指向的字符串的大小
|
| delim | - | 用以停止提取的分隔字符。它不会被提取或存储。 |
| strbuf | - | 要读取内容到的流缓冲 |
返回值
1) 提取到的字符或
Traits::eof()。2-6)
*this异常
在出现错误(错误状态标志不是 goodbit)并且 exceptions() 已设置为对该状态抛出时,会抛出 failure。
如果内部操作抛出了异常,那么捕获它并设置 badbit。如果 exceptions() 设置了 badbit,那么就会重抛该异常。
示例
运行此代码
#include <iostream>
#include <sstream>
int main()
{
std::istringstream s1("Hello, world.");
char c1 = s1.get(); // 读取'H'
std::cout << "在读取 " << c1 << " 后,gcount() == " << s1.gcount() << '\n';
char c2;
s1.get(c2); // 读取 'e'
char str[5];
s1.get(str, 5); // 读取 "llo,"
std::cout << "在读取 " << str << "后,gcount() == " << s1.gcount() << '\n';
std::cout << c1 << c2 << str;
s1.get(*std::cout.rdbuf()); // 读取剩余内容,不包括 '\n'
std::cout << "\n在最后一次 get() 后,gcount() == " << s1.gcount() << '\n';
}
输出:
在读取 H 后,gcount() == 1
在读取 llo, 后,gcount() == 4
Hello, world.
在最后一次 get() 后,gcount() == 7
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 370 | C++98 | 重载 (5) 的效果是 get(s, count, widen('\n')),但这是重载 (3) 的效果 |
改成get(strbuf, widen('\n'))
|
| LWG 531 | C++98 | 重载 (3,4) 无法处理 count 非正的情况
|
此时不会提取字符 |
参阅
| 按区块提取字符 (公开成员函数) | |
| 提取带格式数据 (公开成员函数) | |
| 提取字符和字符数组 (函数模板) |