C 停止标准输出刷新



我正在编写一个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')刷新挂起的输出。

最新更新