当前位置:  开发笔记 > 编程语言 > 正文

将cout分配给变量名称

如何解决《将cout分配给变量名称》经验,为你挑选了2个好方法。

在ANSI C++中,如何将cout流分配给变量名?我想要做的是,如果用户指定了输出文件名,我在那里发送输出,否则,将其发送到屏幕.所以类似于:

ofstream outFile;
if (outFileRequested) 
    outFile.open("foo.txt", ios::out);
else
    outFile = cout;  // Will not compile because outFile does not have an 
                     // assignment operator

outFile << "whatever" << endl;

我也尝试将其作为宏函数:

#define OUTPUT outFileRequested?outFile:cout

OUTPUT << "whatever" << endl;

但这也给了我一个编译器错误.

我想我可以为每个输出使用IF-THEN块,但是如果可以的话我想避免使用它.有任何想法吗?



1> Adam Rosenfi..:

使用参考.请注意,引用必须是类型std::ostream,而不是std::ofstream,因为std::coutstd::ostream,所以您必须使用最小公分母.

std::ofstream realOutFile;

if(outFileRequested)
    realOutFile.open("foo.txt", std::ios::out);

std::ostream & outFile = (outFileRequested ? realOutFile : std::cout);



2> Johannes Sch..:

我假设您的程序行为类似于标准的unix工具,当没有给出文件时会写入标准输出,当给定文件时会写入该文件.您可以重定向cout以写入另一个流缓冲区.只要您的重定向处于活动状态,写入cout的所有内容都会透明地写入您指定的目标位置.一旦重定向对象超出范围,就会放入原始流并输出再次写入屏幕:

struct CoutRedirect { 
    std::streambuf * old; 
    CoutRedirect():old(0) {
        // empty
    }

    ~CoutRedirect() {
        if(old != 0) {
            std::cout.rdbuf(old);
        }
    }

    void redirect(std::streambuf * to) {
        old = std::cout.rdbuf(to);
    }
}

int main() {
    std::filebuf file;
    CoutRedirect pipe;
    if(outFileRequested) {
        file.open("foo.txt", std::ios_base::out);
        pipe.redirect(&file);
    }
}

现在,只要管道在main中存在,cout就会被重定向到该文件.您可以通过使其不可复制来使其更"生产就绪",因为它尚未准备好被复制:如果副本超出范围,它将恢复原始流.


Hosam,故意不是单身人士,允许暂时改变cout的目的地,单身人士将永远改变cout.即使你不想只是暂时改变它,如果你可以做一些没有单身的东西,你应该没有.在这里,我认为没有明确的做法
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有