public member function
<streambuf> <iostream>

std::basic_streambuf::sputbackc

int_type sputbackc (char_type c);
将字符放回
尝试将受控输入序列的当前位置指示器移回当前位置之前的一个字符。

成员函数 sungetc 的行为类似,但不需要任何参数。

内部,如果读取指针gptr)没有任何后推位置可用,或者 c 不等于当前读取位置之前的字符,则函数会调用虚保护成员 pbackfail。否则,函数直接使用读取指针gptr),而不调用虚成员函数。

其行为等同于如下实现:
1
2
3
4
5
6
int_type sputbackc(char_type c) {
  if ( (!gptr()) || (gptr()==eback()) || (!traits_type::eq(c,gptr()[-1])) )
    return pbackfail (traits_type::to_int_type(c));
  gbump(-1);
  return traits_type::to_int_type(*gptr());
}

参数

c
要放回的字符。
如果此字符与后推位置的字符不匹配,其行为取决于 pbackfail:它可能失败、被忽略或覆盖该位置的字符。
成员类型 char_type流缓冲区(第一个类模板参数)中字符的类型。

返回值

通过成员 traits_type::to_int_type 转换为 int_type 类型的值,即放回字符的值。
如果失败,该函数返回*文件结束符*值(traits_type::eof())。
成员类型int_type是能够表示任何字符值或特殊*文件结束*符的整型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// sputbackc example
#include <iostream>     // std::cin, std::cout, std::streambuf, std::streamsize

int main () {
  char ch;
  std::streambuf * pbuf = std::cin.rdbuf();

  std::cout << "Please, enter some letters and then a number: ";
  do {
    ch = pbuf->sbumpc();

    if ( (ch>='0') && (ch <='9') )
    {
      pbuf->sputbackc (ch);
      long n;
      std::cin >> n;
      std::cout << "You entered number " << n << '\n';
      break;
    }
  } while ( ch != std::streambuf::traits_type::eof() );

  return 0;
}

此示例逐个从标准输入获取字符。当找到第一个数字时,调用 sputback 将流的位置恢复到该数字,以便使用提取运算符 >> 将其提取为数字的一部分。

数据竞争

修改*流缓冲区*对象。
同时访问同一*流缓冲区*对象可能会导致数据竞争。

异常安全

基本保证:如果抛出异常,则流缓冲区处于有效状态(这也适用于标准派生类)。

另见