std::cout重定向的范围是什么?

3

大家好,我希望你们这些优秀的程序员能够帮忙翻译一下。我一直在尝试将std::cout重定向到文件中,这样当执行代码时,例如:

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

我将把单词"hello"写入我正在重定向的文件。

我有以下程序:

// 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
不,你的out对象超出了范围。 - WhiZTiM
你真的需要 std::endl 提供的额外功能吗?'\n' 可以结束一行。 - Pete Becker
嗨,Pete。我不这么认为,但这是他们在课堂上要求我们做的。谢谢! - avneraggy
2个回答

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是自动存储期对象。因此,在您最后的std::cout操作之前的"}"处,out被销毁(结果是缓冲区和文件资源被释放)。
因此,为了确保流缓冲区仍然有效,请保持out处于活动状态。可以查看Barmar的答案以了解其中一种方法。

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;
}

您不需要关闭 out。它的析构函数会自动处理。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接