c++11 标准模板(STL)(std::basic_istream)(五)

basic_istream是C++标准库中的一个类模板,提供对字符流的高级输入支持,包括格式化和无格式化的输入操作。get()函数系列允许从流中读取单个或多个字符,可以指定分隔符或限制读取的字符数。在读取过程中,get()会更新gcount()的值来反映读取的字符数量。示例代码演示了get()的不同用法。
摘要由CSDN通过智能技术生成
定义于头文件 <istream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_istream : virtual public std::basic_ios<CharT, Traits>

类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios 基类访问的底层 basic_streambuf 类所提供的接口实现。大多数库实现中, basic_istream 有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。

无格式输入

从流中读并取走(移除类似指针向下一个元素移动)一个字符

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

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 。注意此函数不在类型 signed char 和 unsigned char 重载,不同于有格式字符输入 operator>> 。

3) 同 get(s, count, widen('\n')) ,即读取至多 count-1 个字符并存储它们到 s 所指向的字符串中,直至找到 '\n' 。

4) 读取字符并存储它们到首元素为 s 所指向的字符数组的相继位置。释出并存储字符,直至出现任何下列条件:

  • 已存储 count - 1 个字符
  • 输入序列中出现文件尾条件(调用 setstate(eofbit) )
  • 下个可用输入字符 c 等于 delim ,以 Traits::eq(c, delim) 确定。不释出此字符(不同于 basic_istream::getline() )。

若未释出字符,则调用 setstate(failbit) 。任何情况下,若 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

异常

若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。

若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit 设置了 exceptions() ,则重抛该异常。

 

调用示例

#include <sstream>
#include <iostream>

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';
}
输出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值