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

定义于头文件 
template<

    class CharT,
    class Traits = std::char_traits

> class basic_istream : virtual public std::basic_ios

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

无格式输入

仅读出但不取走(不移除类似指针并未移动)一个字符

std::basic_istream::peek

int_type peek();

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

参数

(无)

返回值

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

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

异常

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

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

调用示例

#include 
#include 

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

输出

c++11 标准模板(STL)(std::basic_istream)(六)_第1张图片

 

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

std::basic_istream::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 
#include 

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

 输出

c++11 标准模板(STL)(std::basic_istream)(六)_第2张图片

 

往输入流中退回一个字符

std::basic_istream::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 
#include 

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";
    }
}

输出

c++11 标准模板(STL)(std::basic_istream)(六)_第3张图片

 

你可能感兴趣的:(c++,标准库模板,basic_istream,提供字符流上的高层输入支持,无格式输入)