1

我有以下代码,但我不太明白为什么结果恰好如下所示:

#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

其余的在哪里?¿ 只有当我们取消注释上述行时才会输出它......内部会发生什么?有人知道吗?=) 会很有趣...

4

1 回答 1

4

检查失败位是否设置为on cout。您也可以只清除失败位,使用cout.clear().


这是标准(第 27.7.3.6.3 节)中的规则,要求在这种情况下设置失败位:

basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);

效果:表现为未格式化的输出函数。哨兵对象构造完成后,if sbis null 调用setstate(badbit)(可能会抛出ios_base::failure)。

从中获取字符sb并将它们插入*this. 读取sb并插入字符,直到发生以下任何情况:

  • 文件结束出现在输入序列上;
  • 在输出序列中插入失败(在这种情况下,不提取要插入的字符);
  • 从 获取字符时发生异常sb

如果函数没有插入任何字符,它会调用setstate(failbit)(可能会抛出ios_base::failure)。如果在提取字符时抛出异常,则函数设置failbit为错误状态,并且如果failbitexceptions()捕获的异常中为 on,则重新抛出。

回报:*this

于 2012-07-11T21:38:37.540 回答