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

来自cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
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。如果 exceptions() 设置了 badbit,那么就会重抛该异常。

示例

演示修改和非修改 putback() 间的差异

#include <iostream>
#include <sstream>
 
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::cout << "--\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 失败\n";
    s2.clear();
 
    std::cout << "--\n";
 
    s2.clear();
    if (s2.putback('H')) // 非修改回放
        std::cout << s2.rdbuf() << '\n';
    else
        std::cout << "putback 失败\n";
}

输出:

Yello, world
--
putback 失败
--
Hello, world

参阅

在输入序列中放回一个字符
(std::basic_streambuf<CharT,Traits> 的公开成员函数)
撤销上一个字符的提取
(公开成员函数)
读取下一个字符,但不会提取它
(公开成员函数)