【问题标题】:Should command line redirecting of stdout always redirect cout too?标准输出的命令行重定向也应该总是重定向 cout 吗?
【发布时间】:2020-05-11 12:41:14
【问题描述】:

我不清楚从命令行将 stdout 重定向到文件是否也应该始终重定向 cout(对于 stderr 和 cerr 也是如此)。

作为测试,我编写了下面的代码。我的理解是,将sync_with_stdio的参数设置为true,这是默认值,cout会将其输出流式传输到stdout,在这种情况下重定向stdout也会重定向cout,这就是在我的Win10机器上使用VS时发生的情况。

但是,当我将参数更改为 false 时,所有三个输出仍然被重定向。我半点期望只有 printf 输出会被重定向,而 cout 输出仍然会显示。

由于我显然遗漏了一些东西,因此将不胜感激。谢谢!

#include <iostream>
int main()
{
   std::ios::sync_with_stdio(false);
   std::cout << "a\n";
   std::printf("b\n");
   std::cout << "c\n";
}

【问题讨论】:

    标签: c++ command-line stdout cout output-redirect


    【解决方案1】:

    您误解了sync_with_stdio 的含义。它与重定向完全无关,它只涉及两个流之间的同步。如果设置为false,则两个流可以独立缓冲。

    但最终两个流都写入标准输出文件描述符。 stderr 和(用于读取)stdin 也是如此。

    如果你想重定向std::cout,你需要通过rdbuf重置它的流缓冲区。

    【讨论】:

      【解决方案2】:

      来自cppreference(强调我的):

      全局对象 std::cout 和 std::wcout 控制输出到实现定义类型的流缓冲区(派生自 std::streambuf),与标准 C 输出流 stdout 相关联。

      sync_with_stdio:

      设置标准 C++ 流是否在每次输入/输出操作后与标准 C 流同步

      std::cout 总是写入标准输出。

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 1970-01-01
        • 2014-01-20
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        相关资源
        最近更新 更多