public member function
<istream> <iostream>

std::basic_istream::unget

basic_istream& unget();
退回字符
尝试将流的当前位置减少一个字符,使从流中提取的最后一个字符再次可供提取操作使用。

在内部,该函数首先通过构造一个 sentry 对象(将 noskipws 设置为 true)来访问输入序列。然后(如果 good),它会对其关联的 流缓冲区 对象(如果有)调用 sungetc。最后,在返回之前销毁 sentry 对象。

如果在调用之前设置了 eofbit 标志,则函数失败(设置 failbit 并返回)。
该函数会清除在调用之前设置的 eofbit 标志。

如果对 sungetc 的调用失败,函数会将 badbit 标志设置为 true。请注意,即使该函数在从流中提取字符后立即被调用,也可能发生这种情况(这取决于关联的 流缓冲区 对象的内部实现)。

调用此函数会将 gcount 的返回值设置为零。

参数



返回值

*thisbasic_istream 对象。

错误通过修改 内部状态标志 来信号指示
标志错误
eofbit-
failbit构造 sentry 失败(例如,当调用前的 *流状态* 不是 good 时)。
badbitsungetc 的内部调用失败,或者流上发生了其他错误(例如,当函数捕获内部操作抛出的异常时,或者当没有 流缓冲区 与流关联时)。
当设置时,流的完整性可能受到影响。
多个标志可能由单个操作设置。

如果操作设置了一个与成员 exceptions 注册的 内部状态标志,则函数将抛出一个成员类型为 failure 的异常。

示例

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

int main () {
  std::cout << "Please, enter a number or a word: ";
  char c = std::cin.get();

  if ( (c >= '0') && (c <= '9') )
  {
    int n;
    std::cin.unget();
    std::cin >> n;
    std::cout << "You entered a number: " << n << '\n';
  }
  else
  {
    std::string str;
    std::cin.unget();
    getline (std::cin,str);
    std::cout << "You entered a word: " << str << '\n';
  }
  return 0;
}

可能的输出
Please, enter a number or a word: 7791
You entered a number: 7791


数据竞争

修改流对象。
并发访问同一个流对象可能导致数据争用。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果结果 错误状态标志 不是 goodbit 并且成员 exceptions 被设置为针对该状态进行抛出,则抛出类型为 failure 的异常。
内部操作抛出的任何异常都会被函数捕获和处理,并将 badbit 设置为 true。如果 badbit 在最后一次调用 exceptions 时被设置,则函数会重新抛出捕获到的异常。

另见