使用rdbuf复制流在空输入

时间:2015-11-20 14:42:08

标签: c++ stream ostream

使用rdbuf

将流复制到另一个流是一种众所周知的方法
#include <iostream>
#include <fstream>

int main()
{
  std::ifstream in{"/tmp/foo.txt"};
  std::cerr << in.rdbuf();
  std::cerr << "Done\n";
}

然而,当cerr为空时,这会打破(=设置坏位)我的/tmp/foo.txt。因此,不会显示Done\n

为什么?用G ++ / libstdc ++ / GNU Linux和Clang ++ / libc ++ / OS X观察。

1 个答案:

答案 0 :(得分:3)

这似乎是定义的行为 - 参见例如http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt

  

如果未插入任何字符,则执行setstate(failbit)

我同意这有点无益。