我正在编写一个C程序,我在其中打印到stderr并在代码中使用putchar()。我希望控制台上的输出显示所有标准,然后在程序结束之前最终刷新标准输出。有谁知道一种方法可以在发生 putchar('') 时阻止 stdout 刷新?
我想我可以做一个 if 语句来确保它不会放置任何换行符,但我更喜欢将一些或多行代码放在程序顶部以停止所有刷新,直到我在程序底部说 fflush(stdout)
你想做的事情非常脆弱。C 没有规定 stdio 的实现在任何情况下都不刷新输出的义务。即使你让它为你工作,此行为也将取决于不超过缓冲区大小。如果你真的需要这种行为,你应该自己缓冲输出(可能将其写入tmpfile()
而不是stdout
),然后将其全部复制到stdout
作为程序退出前的最后一步。
使用管道从控制台运行命令:
my_command >output.txt
所有输出将立即显示stderr
。写给stdout
的东西会去output.txt
.
仅限Windows。 如果有人拥有Unix解决方案,我自己仍在寻找它!
下面是一个适用于 Windows 的最小工作示例,它将缓冲区发送到标准输出而不刷新。您可以通过更改max_buffer
来调整刷新发生之前的最大缓冲区大小,尽管我想有一些上限!
#include <windows.h>
#include <string.h>
int main()
{
const char* my_buffer = "hello, world!";
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
int max_buffer = 1000000;
int num_remaining = strlen(my_buffer);
while (num_remaining)
{
DWORD num_written = 0;
int buffer_size = num_remaining < max_buffer ? num_remaining : max_buffer;
int retval = WriteConsoleA(hStdout, my_buffer, buffer_size, &num_written, 0);
if (retval == 0 || num_written == 0)
{
// Handle error
}
num_remaining -= num_written;
if (num_remaining == 0)
{
break;
}
my_buffer += num_written;
}
}
setvbuf()
将输出完全缓冲到stdout
,并提供足够大的缓冲区大小来实现您的目的:
#include <stdio.h>
int main() {
// issue this call before any output
setvbuf(stdout, NULL, _IOFBF, 16384);
...
return 0;
}
默认情况下,输出到 stderr
是无缓冲的,因此它应立即转到控制台。连接到端子时,stdout
的输出默认为线路缓冲。将其设置为 _IOFBF
(完全缓冲)应防止putchar('n')
刷新挂起的输出。