std :: cout

时间:2017-09-05 19:02:20

标签: c++ redirect scope stdout

嗨,你们所有优秀的程序员。 我一直在尝试将std::cout重定向到文件,以便例如在执行代码时

std::cout << "hello" << std::endl;

这个词&#34;你好&#34;将被写入我重定向到的文件。

我有以下程序:

// Redirection.cpp
#include <iostream>
#include <fstream>

int main(int argc, char **argv) {
    if(argc == 2){
        std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
        std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
        std::cout.rdbuf(out.rdbuf());
        std::cout << "This file contains output of Redirection.cpp" << std::endl;
    }
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
    return 0;
}

我期待output.txt阅读:

This file contains output of Redirection.cpp
This should be displayed in console or in the output file, if supplied

但它只读取:

This file contains output of Redirection.cpp

我认为我使用的重定向仅适用于该范围,而不适用于任何外部范围。

我该如何解决这个问题?我需要的行为是,只有在提供输出文件时,所有打印都将写入该文件而不是控制台。

感谢一大堆免费帮助爱和支持!

2 个答案:

答案 0 :(得分:4)

#include <iostream>
#include <fstream>

int main(int argc, char **argv) {
    if(argc == 2){
        std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
        std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
        std::cout.rdbuf(out.rdbuf());
        std::cout << "This file contains output of Redirection.cpp" << std::endl;
    }
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
    return 0;
}

回想一下,out自动存储持续时间的对象。因此,在&#34; } &#34;就在您上一次std::cout操作之前,out被销毁(结果是,缓冲区和文件资源被释放)。

因此,为了确保流缓冲区仍然有效,请保持out 活着。如果有一种方法,请参阅Barmar's answer

答案 1 :(得分:3)

cout之外声明if变量,以便在if结束时它不会超出范围。

int main(int argc, char *argv[]) {
    std::ofstream out;
    if (argc == 2) {
        std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
        out.open("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
        std::cout.rdbuf(out.rdbuf());
        std::cout << "This file contains output of Redirection.cpp" << std::endl;
    }
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
    if (out.is_open()) {
        out.close();
    }
    return 0;
}