std::basic_istream<CharT,Traits>::get

来自cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
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() 并设置 failbiteofbit
2) 读取一个字符,如果可用就将它存储到 ch。否则,不修改 ch 并设置 failbiteofbit。注意与有格式字符输入 operator>> 不同,此函数不对类型 signed charunsigned 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())存储到数组的下个相继位置。
5)get(strbuf, widen('\n')),即读取可用字符并插入它们到给定的 basic_streambuf 对象,直到找到 '\n'
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。如果对 badbit 设置了 exceptions(),那么就会重抛该异常。

示例

#include <sstream>
#include <iostream>
 
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 非正的情况 此时不会提取字符

参阅

提取一块字符
(公开成员函数)
提取带格式数据
(公开成员函数)
提取字符和字符数组
(函数模板)