std::basic_istream<CharT,Traits>::putback
来自cppreference.com
<tbody>
</tbody>
basic_istream& putback( char_type ch ); |
||
将字符 ch 回放到输入流,使得下个提取的字符将为 ch。
首先清除 eofbit,然后表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,如果 rdbuf() 非空,那么就会调用 rdbuf()->sputbackc(ch),它会在 ch 不等于最近输出的字符时调用 rdbuf()->pbackfail(ch)。
如果 rdbuf() 为空或 rdbuf->sputbackc(ch) 返回了 Traits::eof(),那么就会调用 setstate(badbit)。
任何情况下都会将 gcount() 计数器设置为零。
参数
| ch | - | 要放入输入流的字符 |
返回值
*this
异常
在出现错误(错误状态标志不是 goodbit)并且 exceptions() 已设置为对该状态抛出时,会抛出 failure。
如果内部操作抛出了异常,那么捕获它并设置 badbit。如果 exceptions() 设置了 badbit,那么就会重抛该异常。
示例
演示修改和非修改 putback() 间的差异
运行此代码
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s1("Hello, world"); // IO 流
s1.get();
if (s1.putback('Y')) // 修改缓冲区
std::cout << s1.rdbuf() << '\n';
else
std::cout << "putback 失败\n";
std::cout << "--\n";
std::istringstream s2("Hello, world"); // 仅输入流
s2.get();
if (s2.putback('Y')) // 不能修改仅输入流
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback 失败\n";
s2.clear();
std::cout << "--\n";
s2.clear();
if (s2.putback('H')) // 非修改回放
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback 失败\n";
}
输出:
Yello, world
--
putback 失败
--
Hello, world
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2243 | C++98 | 调用 sputbackc() 时没有带上实参
|
以 ch 作为实参
|
参阅
| 在输入序列中放回一个字符 ( std::basic_streambuf<CharT,Traits> 的公开成员函数)
| |
| 撤销上一个字符的提取 (公开成员函数) | |
| 读取下一个字符,但不会提取它 (公开成员函数) |