我有以下代码,我不太明白为什么结果恰好如下所示:
#include <iostream>
#include <sstream>
using namespace std;
int main () {
std::stringstream s;
std::streambuf *backup;
backup = cout.rdbuf();
s << "Oh my god" << endl;
cout << "Before1" << endl;
cout << s.rdbuf();
cout << "After1" << endl;
cout << "Before2" << endl;
//s.seekg(0, std::ios_base::beg); // If that is in: After 2 is printed!
cout << s.rdbuf();
//cout.rdbuf(backup); // If that is in, also After 2 is printed!
cout << "After2" << endl;
}
输出:
Before1
Oh my god
After1
Before2
其余的地方??¿只有当我们取消上述线路时才会输出... 内部会发生什么?有人知道吗? =)会很有趣......
答案 0 :(得分:4)
检查cout
上是否设置了失败位。您也可以使用cout.clear()
清除失败位。
以下是标准规则(第27.7.3.6.3节)中要求在这种情况下设置失败位的规则:
basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);
效果:表现为无格式输出功能。构造sentry对象后,如果
sb
为null,则调用setstate(badbit)
(可能会抛出ios_base::failure
)。从
sb
获取字符并将其插入*this
。从sb
读取字符并插入,直到出现以下任何一种情况:
- 文件结尾出现在输入序列上;
- 在输出序列中插入失败(在这种情况下,不会提取要插入的字符);
- 从
sb
获取角色时发生异常。如果该函数没有插入任何字符,则会调用
setstate(failbit)
(可能会抛出ios_base::failure
)。如果在提取字符时抛出异常,则函数会将failbit
设置为错误状态,如果failbit
中的exceptions()
处于启用状态,则会重新抛出捕获的异常。返回:
*this
。