【问题标题】:How to redirect cout to console in linux?如何将 cout 重定向到 linux 中的控制台?
【发布时间】:2011-12-31 20:27:09
【问题描述】:

我正在编写一个程序,它是另一个程序的一部分。在主程序中,他们将 cout 的默认方向重定向到一个 LOG 文件。为了调试我自己的程序,我需要将 cout 的输出重定向到 linux 中的控制台(终端)。我无法像示例中描述的方法那样保存控制台rdbuf

http://www.cplusplus.com/reference/iostream/ios/rdbuf/

为了我的目的,有什么方法可以在 c++ 中获取 linux 控制台的句柄?

【问题讨论】:

  • Chris Dodd 的回答是正确的,但首先要确保你没有把事情复杂化。处理问题的常用方法是将实际输出与调试消息分开。将实际输出发送至cout,将其他任何内容发送至cerr。这样,当您的程序的输出被重定向时,调试信息仍会显示在终端上。您甚至可以将标准输出和标准错误流重定向到不同的文件:./yourprogram 1>output.txt 2>debug.txt

标签: linux redirect console cout


【解决方案1】:

我无法编译 Chris 示例。 我知道“->open”没有在“console->open”中声明。 我正在使用 kdevelop 4.5.2 来编译它,起作用的是这段代码

ofstream console("/dev/tty"); //create stream
cout.rdbuf(console.rdbuf()); //redirects cout to the new stream

【讨论】:

    【解决方案2】:

    您需要定义“控制台”和“重定向”的含义。如果您在某些上下文中运行程序,其输出已被重定向到其他地方,并且您想将其重新重定向到控制终端(许多人说“控制台”时的意思),您可以重定向到 /dev /tty,例如:

    program >/dev/tty
    

    当你运行程序时。上面可能是 shell 脚本中的一行,或者是作为参数传递给 system(3) 的字符串——这取决于你如何启动程序。

    如果你想在程序中改变输出的去向,你可以打开一个新的 streambuf 引用你想要的,然后使用 ios::rdbuf 重定向到它:

    filebuf *console = new filebuf();
    console->open("/dev/tty");
    if (!console->is_open()) {
        cerr << "Can't open console" << endl;
    } else {
        cout.ios::rdbuf(console);
    }
    

    【讨论】:

    • 'console' 表示“终端”,“redirect”表示我的程序是另一个程序的一部分,该程序将默认输出更改为 LOG 文件。我想在终端上显示一些输出来调试我自己的代码。
    • 谢谢!但是当我编译你建议的代码时,它抱怨没有匹配的函数来调用 'rdbuf(std::fstream*&)'
    • 最后一行应该是cout.ios::rdbuf(console-&gt;rdbuf());
    • 谢谢!现在可以编译代码,但它不会将 cout &lt;&lt; "some test text" &lt;&lt; endl 重定向到 LOG 文件或控制台(终端)!
    • 根据您的编译器支持的 C++ 版本,您可能需要cout.set_rdbufcout.ios::rdbuf 而不是cout.rdbuf
    【解决方案3】:

    cout 转到stdout,根据定义,这是文件描述符 1。

    【讨论】:

    • 对不起,我没听明白。能否给个示例代码?
    • 你到底想完成什么? cout 默认情况下已经进入控制台,所以我不确定。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2019-04-12
    • 2016-10-21
    相关资源
    最近更新 更多