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

定义于头文件 <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>::peek

int_type peek();

表现为无格式输入函数 (UnformattedInputFunction) 。构造并测试 sentry 对象后,从输入流读取下个字符而不释出它。

参数

(无)

返回值

若 good() == true ,则返回获得自 rdbuf()->sgetc() 的下个字符。

否则,返回 Traits::eof() 。

异常

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

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

调用示例

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream s1("Hello, world.");
    char c1 = s1.peek();
    char c2 = s1.get();
    std::cout << "Peeked: " << c1 << " got: " << c2 << '\n';
}
输出

 

撤销流中刚取走(移除,类似指针向后退回一个位置)的字符

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

basic_istream& unget();

令最近释出的字符再次可用。

首先清除 eofbit 。

(C++11 起)

然后函数表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,若设置了任何 ios_base::iostate 标志,则函数设置 failbit 并返回。否则,调用 rdbuf()->sungetc() 。

若 rdbuf()->sungetc() 返回 Traits::eof() ,则调用 setstate(badbit) 。

任何情况下,设置 gcount() 计数器为零。

参数

(无)

返回值

*this

异常

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

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

调用示例

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream s1("Hello, world.");
    char c1 = s1.get();
    if (s1.unget())
    {
        char c2 = s1.get();
        std::cout << "Got: " << c1 << " got again: " << c2 << '\n';
    }
}
 输出

 

往输入流中退回一个字符

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

basic_istream& putback( char_type ch );

回放字符 ch 到输入流,从使得下个释出的字符将为 ch

首先清除 eofbit ,然后表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,若 rdbuf() 非空,则调用 rdbuf()->sputbackc(ch) ,若 ch 不等于最近输出的字符,则它调用 rdbuf()->pbackfail(ch) 。

rdbuf() 为空或若 rdbuf->sputbackc(ch) 返回 Traits::eof() ,则调用 setstate(badbit) 。

任何情况下,设置 gcount() 计数器为零。

参数

ch-要放入输入流的字符

返回值

*this

异常

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

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

调用示例

#include <sstream>
#include <iostream>

int main()
{
    std::stringstream s1("Hello, world"); // IO 流
    s1.get();
    if (s1.putback('Y')) // 修改缓冲区
    {
        std::cout << s1.rdbuf() << '\n';
    }
    else
    {
        std::cout << "putback failed\n";
    }

    std::istringstream s2("Hello, world"); // 仅输入流
    s2.get();
    if (s2.putback('Y')) // cannot modify input-only buffer
    {
        std::cout << s2.rdbuf() << '\n';
    }
    else
    {
        std::cout << "putback failed\n";
    }

    s2.clear();
    if (s2.putback('H')) // 非修改回放
    {
        std::cout << s2.rdbuf() << '\n';
    }
    else
    {
        std::cout << "putback failed\n";
    }
}
输出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值