std :: ostream到文件或标准输出

时间:2014-04-28 15:46:43

标签: c++11 iostream

如果文件名可用,我想将输出写入文件,否则在屏幕(stdout)上写。所以我在这个论坛上阅读了帖子并找到了一个代码,下面我将其包含在一个方法中:

std::shared_ptr<std::ostream> out_stream(const std::string & fname) {

std::streambuf * buf;
std::ofstream of;

if (fname.length() > 0) {
    of.open(fname);
    buf = of.rdbuf();
} else
    buf = std::cout.rdbuf();

std::shared_ptr<std::ostream> p(new std::ostream(buf));
return p;
}

代码在就地使用时效果很好。不幸的是,当它被包装到一个单独的方法中时表现得很奇怪(如上所述)。是因为一旦调用完成,方法(of buff)中定义的对象就会被销毁吗?

我在几个地方使用这部分代码,它确实应该被提取为一个单独的非重复片段:方法或类。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

你是正确的,你所遇到的问题来自于of的破坏。不会像这样(未经测试)工作吗?

std::shared_ptr<std::ostream>
out_stream(const std::string &fname) {
    if (fname.length() > 0)
        std::shared_ptr<std::ostream> p(new std::ofstream(fname));
    else
        std::shared_ptr<std::ostream> p(new std::ostream(std::cout.rdbuf()));
}