stdout 的命令行重定向也应该总是重定向 cout 吗?

Should command line redirecting of stdout always redirect cout too?

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

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

但是,当我将参数更改为 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";
}

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

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

如果你想重定向 std::cout,你需要通过rdbuf.

重置它的流缓冲区

来自 cppreference(强调我的):

The global objects std::cout and std::wcout control output to a stream buffer of implementation-defined type (derived from std::streambuf), associated with the standard C output stream stdout.

sync_with_stdio:

Sets whether the standard C++ streams are synchronized to the standard C streams after each input/output operation.

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