# std::basic_streambuf<CharT,Traits>::sputbackc

< cpp‎ | io‎ | basic streambuf

int_type sputbackc( char_type c ); |  |

放回字符到获取区。

若回放位置在获取区中可用（ gptr() > eback() ），而字符 `c` 等于 gptr() 左一位置的字符（以 Traits::eq(c, gptr()[-1]) 确定），则简单地减少下一位置指针（ gptr() ）。

否则，调用 pbackfail(Traits::to_int_type(c)) 放回到获取区，或一同修改获取区和可能的关联字符序列。

I/O 流函数 `basic_istream::putback` 以此函数实现。

### 参数

c | - | 要回放的字符

### 返回值

若回放位置可用，则返回下一位置指针现在指向的字符，以 Traits::to_int_type(*gptr()) 转换为 `int_type` 。来自此 streambuf 的下个单字符输入将返回此字符。

若回放位置不可用，则返回 pbackfail() 所返回者，在失败时为 Traits::eof() 。

### 示例

    #include <iostream>
    #include <sstream>

    int main()
    {
        std::stringstream s("abcdef"); // gptr() 指向 "abcdef" 中的 'a'
        std::cout << "Before putback, string holds " << s.str() << '\n';
        char c1 = s.get(); // c1 = 'a' ， gptr() 现在指向 "abcdef" 中的 'b'
        char c2 = s.rdbuf()->sputbackc('z'); // 同 s.putback('z')
                                             // gptr() 现在指向 "zbcdef" 中的 'z'
        std::cout << "After putback, string holds " << s.str() << '\n';
        char c3 = s.get(); // c3 = 'z' ， gptr() 现在指向 "zbcdef" 中的 'b'
        char c4 = s.get(); // c4 = 'b' ， gptr() 现在指向 "zbcdef" 中的 'c'
        std::cout << c1 << c2 << c3 << c4 << '\n';

        s.rdbuf()->sputbackc('b');  // gptr() 现在指向 "zbcdef" 中的 'b'
        s.rdbuf()->sputbackc('z');  // gptr() 现在指向 "zbcdef" 中的 'z'
        int eof = s.rdbuf()->sputbackc('x');  // 无内容能反获取： pbackfail() 失败
        if (eof == EOF)
            std::cout << "No room to putback after 'z'\n";
    }

输出：

    Before putback, string holds abcdef
    After putback, string holds zbcdef
    azzb
    No room to putback after 'z'

### 参阅

sungetc | 回移一位输出序列中的下一位置指针 (公开成员函数)
putback | 往输入流中退回一个字符 (`std::basic_istream<CharT,Traits>` 的公开成员函数)