命名空间
变体
操作

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)

从流中提取字符或字符。

所有版本的行为都与 UnformattedInputFunctions 相同。在构造和检查哨兵对象后,这些函数将执行以下操作

1) 如果可用,读取一个字符并返回它。否则,返回 Traits::eof() 并设置 failbiteofbit
2) 如果可用,读取一个字符并将其存储到 ch 中。否则,将 ch 保持不变并设置 failbiteofbit。请注意,与格式化字符输入运算符 >> 不同,此函数不会在类型 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) 读取字符并将它们插入到给定 basic_streambuf 对象控制的输出序列中。直到以下任一情况发生时,才会提取字符并将它们插入到 strbuf
  • 输入序列中出现文件结尾条件。
  • 插入输出序列失败(在这种情况下,无法插入的字符不会被提取)。
  • 下一个可用的输入字符 c 等于 delim,由 Traits::eq(c, delim) 确定。此字符不会被提取。
  • 发生异常(在这种情况下,异常会被捕获,不会被重新抛出)。

如果没有提取任何字符,则调用 setstate(failbit)

所有版本都将 gcount() 的值设置为提取的字符数。

内容

[编辑] 参数

ch - 对要写入结果的字符的引用
s - 指向要存储字符的字符字符串的指针
count - s 指向的字符字符串的大小
delim - 用于在该处停止提取的定界字符。它不会被提取或存储
strbuf - 要读取内容的流缓冲区

[编辑] 返回值

1) 提取的字符或 Traits::eof()
2-6) *this

[编辑] 异常

failure 如果发生错误(错误状态标志不是 goodbit)并且 exceptions() 设置为对该状态抛出异常。

如果内部操作抛出异常,则会捕获该异常并设置 badbit。如果 exceptions()badbit 设置,则重新抛出异常。

[编辑] 示例

#include <iostream>
#include <sstream>
 
int main()
{
    std::istringstream s1("Hello, world.");
    char c1 = s1.get(); // reads 'H'
    std::cout << "after reading " << c1 << ", gcount() == " <<  s1.gcount() << '\n';
 
    char c2;
    s1.get(c2);         // reads 'e'
    char str[5];
    s1.get(str, 5);     // reads "llo,"
    std::cout << "after reading " << str << ", gcount() == " <<  s1.gcount() << '\n';
 
    std::cout << c1 << c2 << str;
    s1.get(*std::cout.rdbuf()); // reads the rest, not including '\n'
    std::cout << "\nAfter the last get(), gcount() == " << s1.gcount() << '\n';
}

输出

after reading H, gcount() == 1
after reading llo,, gcount() == 4
Hello, world.
After the last get(), gcount() == 7

[编辑] 缺陷报告

以下更改行为的缺陷报告已追溯应用到先前发布的 C++ 标准。

DR 应用于 发布的行为 正确的行为
LWG 370 C++98 重载(5)的影响是get(s, count, widen('\n')),
也就是重载(3)的影响
已更正为
get(strbuf, widen('\n'))
LWG 531 C++98 重载(3,4)无法处理
count为非正数时的
在这种情况下,不会
提取任何字符

[编辑] 另请参见

提取字符块
(公共成员函数) [编辑]
提取格式化数据
(公共成员函数) [编辑]
提取字符和字符数组
(函数模板) [编辑]