public member function
<streambuf> <iostream>

std::streambuf::sungetc

int sungetc();
将当前位置指示器向后移动一位
尝试将“受控输入序列”的当前位置指示器向后移动一个位置,使得当前位置之前的字符再次可用于下一个输入操作。

在内部,如果函数被调用时“读指针”(gptr)指向“缓冲区起始”(eback),则函数会调用虚保护成员函数pbackfail。否则,函数将直接使用“读指针”(gptr),而不调用任何虚成员函数。

其行为等同于如下实现:
1
2
3
4
5
int sungetc() {
  if ( (!gptr()) || (gptr()==eback()) ) return pbackfail();
  gbump(-1);
  return *gptr();
}

返回值

作为int类型的值,“受控输入序列”的新当前字符。
失败时,该函数返回文件尾(end-of-file)值(EOF)。

示例

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

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->sungetc ();
      long n;
      std::cin >> n;
      std::cout << "You entered number " << n << '\n';
      break;
    }
  } while ( ch != EOF );

  return 0;
}

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

数据竞争

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

异常安全

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

另见