Namespaces
Variants

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

From cppreference.net
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)
(注:根据要求,所有HTML标签、属性及 标签内的C++代码均未翻译,仅对页面上的纯文本进行了翻译。表格中的数字编号(1)-(6)作为标识符予以保留)

从流中提取一个或多个字符。

所有版本的行为都如同 UnformattedInputFunction s 。在构造并检查哨兵对象后,这些函数执行以下操作:

1) 读取一个字符并在可用时返回。否则返回 Traits :: eof ( ) 并设置 failbit eofbit
2) 若存在可用字符,则读取一个字符并存储到 ch 中。否则,保持 ch 不变,并设置 failbit eofbit 。请注意,与格式化字符输入运算符>>不同,此函数未针对 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 ( ) )。
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 if an error occurred (the error state flag is not goodbit ) and exceptions() is set to throw for that state.

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

示例

#include <iostream>
#include <sstream>
int main()
{
    std::istringstream s1("Hello, world.");
    char c1 = s1.get(); // 读取 'H'
    std::cout << "after reading " << c1 << ", gcount() == " <<  s1.gcount() << '\n';
    char c2;
    s1.get(c2);         // 读取 'e'
    char str[5];
    s1.get(str, 5);     // 读取 "llo,"
    std::cout << "after reading " << str << ", gcount() == " <<  s1.gcount() << '\n';
    std::cout << c1 << c2 << str;
    s1.get(*std::cout.rdbuf()); // 读取剩余部分,不包括 '\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++标准。

缺陷报告 应用于 发布时行为 正确行为
LWG 370 C++98 重载 (5) 的效果是 get ( s, count, widen ( ' \n ' ) )
这实际上是重载 (3) 的效果
修正为
get ( strbuf, widen ( ' \n ' ) )
LWG 531 C++98 重载 (3,4) 无法处理
count 为非正值的情况
在此情况下
不提取任何字符

参见

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