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.
Sets whether the standard C++ streams are synchronized to the standard C streams after each input/output operation.
std::cout
总是写入标准输出。
我不清楚从命令行将 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.
Sets whether the standard C++ streams are synchronized to the standard C streams after each input/output operation.
std::cout
总是写入标准输出。