public member function
<istream> <iostream>

std::istream::putback

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

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

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

如果对 sputbackc 的调用失败,则函数将设置 badbit 标志。请注意,即使 c 确实是从流中提取的最后一个字符,这也会发生(具体取决于关联的 流缓冲区 对象的内部实现)。

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

参数

c
要放回的字符。
如果这与 put back 位置的字符不匹配,则行为取决于与流关联的特定 流缓冲区 对象。
  • 字符串缓冲区 中,输出流缓冲区的该值被覆盖,但函数在输入缓冲区上失败。
  • 文件缓冲区 中,该值被覆盖在中间缓冲区上(如果支持):再次读取该字符将产生 c,但关联的输入序列未被修改。
其他类型的 流缓冲区 可能会失败、被忽略或覆盖该位置的字符。

返回值

istream 对象 (*this)。

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

如果操作设置了通过成员 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::putback 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.putback (c);
    std::cin >> n;
    std::cout << "You entered a number: " << n << '\n';
  }
  else
  {
    std::string str;
    std::cin.putback (c);
    getline (std::cin,str);
    std::cout << "You entered a word: " << str << '\n';
  }
  return 0;
}

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


数据竞争

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

异常安全

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

另见