cout一个字符串流两次最终在腐败的cout(最小的例子)

时间:2012-07-11 21:20:06

标签: c++ cout stringstream streambuf

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

#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

其余的地方??¿只有当我们取消上述线路时才会输出... 内部会发生什么?有人知道吗? =)会很有趣......

1 个答案:

答案 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