C++11 std::ostream到文件或标准输出

C++11 std::ostream到文件或标准输出,c++11,iostream,C++11,Iostream,如果文件名可用或在屏幕上(标准输出),我想将输出写入文件。所以我阅读了这个论坛上的帖子,发现了一个代码,下面我将它包装成一个方法: 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.

如果文件名可用或在屏幕上(标准输出),我想将输出写入文件。所以我阅读了这个论坛上的帖子,发现了一个代码,下面我将它包装成一个方法:

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;
}
std::shared\u ptr out\u流(const std::string&fname){
标准::streambuf*buf;
std::的流;
如果(fname.length()>0){
of.open(fname);
buf=of.rdbuf();
}否则
buf=std::cout.rdbuf();
std::shared_ptr p(新std::ostream(buf));
返回p;
}
代码在适当的位置使用时可以完美地工作。不幸的是,当它被包装到一个单独的方法中时(如上所述),它的行为异常。是因为调用完成后,方法(of,buff)中定义的对象会被销毁吗


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

你是正确的,你所遇到的问题来自于对的
的破坏。像这样(未经测试)的东西不管用吗

std::共享
输出流(常数std::string和fname){
如果(fname.length()>0)
std::shared_ptr p(新std::ofstream(fname));
其他的
std::shared_ptr p(新的std::ostream(std::cout.rdbuf());
}

@LightnessRacesinOrbit右!已修复。是的,这是确定的,但我将在将来扩展可能流的列表。例如,如果文件名为stderr,它将打印到std::cerr。所以我想有一个单独的方法,这样当我对一个新的流类型有了另一个想法时,我只能修改它一次。它是一个单独的函数,你提到的扩展很简单。
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()));
}