c++ - 使用 rdbuf 复制流在输入为空时失败

标签 c++ stream ostream

使用 rdbuf 将流复制到另一个流是一种众所周知的方法:

#include <iostream>
#include <fstream>

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

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

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

最佳答案

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

If no characters were inserted, executes setstate(failbit)

我同意这有点没用。

关于c++ - 使用 rdbuf 复制流在输入为空时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33829403/

相关文章:

c++ - operator<< 重载调用打印函数麻烦

c++ - 在 C++ 中处理极小的数字

c++ - 通过引用传递截断的 vector

c++ - 重新抛出包含相同异常的Exception_ptr的多个实例

c++ - 模板和继承类中的 ostream 重载中的重新定义错误

c++ - 任何从 c++filt demangled 输出中获取更多信息的方式

c++ - 是否可以从资源创建Gtk::Builder而不实现try/catch block ?

c - 从 C 中的文件读取和打印时出现奇怪的输出

java - 我如何与 Intent.ACTION_SEND 一起共享和保存图像和文本?

java - Android 流媒体 MSMPEG-4 V3 视频