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

< 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 。若对 `badbit` 设置了 exceptions() ，则重抛该异常。

### 示例

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

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

输出：

    Yello, world
    putback failed
    Hello, world

### 参阅

sputbackc | 在输入序列中放回一个字符 (`std::basic_streambuf<CharT,Traits>` 的公开成员函数)
unget | 撤销流中刚取走（移除，类似指针向后退回一个位置）的字符 (公开成员函数)
peek | 仅读出但不取走（不移除类似指针并未移动）一个字符 (公开成员函数)