【问题标题】:Copy streams using rdbuf fails on empty input使用 rdbuf 复制流在空输入时失败
【发布时间】:2016-02-23 02:26:03
【问题描述】:

使用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 观察。

【问题讨论】:

    标签: c++ stream ostream


    【解决方案1】:

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

    如果没有插入字符,则执行 setstate(failbit)

    我同意这有点无益。

    【讨论】:

    • 确实完全没有帮助 :) 有人会碰巧知道为什么标准是这样的吗?
    • 呃,这是 cppreference 中的一个错误,它设置了失败位([ostream.inserters]/9,或之前的 /8)。不过 OP 的结果是一样的。
    • @Cubbi 哦,谢谢指正。我看到你在那里修好了;我已经修改了我的答案。懒惰是我不去标准文本。
    • 至少这意味着更容易区分这种形式的失败,例如一个空的streambuf,它确实设置了badbit,它更有意义。最明显的做法就是写完之后就清零,这似乎有点丢人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2018-07-22
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多