c - 尝试 printf 进度指示器时 c 循环中的奇怪怪癖

标签 c loops

<分区>

我有一个缓慢运行的循环,可能需要一个小时或更长时间,所以我想打印一个进度指示器。我正在使用以下类型的代码。

for (int i=0; i<=j; i++)
{
    pass[0] = 'A' + i;
    printf("%c", pass[0]);
\\Some slow running code omitted for brevity
}

如果我使用这段代码,它会在整个循环完成时吐出 ABCD...Z(或在找到答案时停止),这违背了拥有进度指示器的目的。但是如果我在 printf 语句中包含换行符\n ,它将在循环运行时逐步打印出 ABCD 。这就是我想要的行为,但不幸的是它在每个字母之间添加了一个换行符。

我尝试添加一个空格,但没有成功,因为在整个循环完成之前它不会打印。我什至尝试使用 putchar() 函数,它的行为与 printf() 函数相同,我无法让它逐步打印出字母,除非我在每个字符之间插入一个新行。谁能解释这种行为或我做错了什么?

最佳答案

stdout 是一个缓冲流,这意味着字符将被存储 在它们实际打印在屏幕上之前首先在缓冲区中。

printf 系列函数在遇到换行符时刷新缓冲区,这就是为什么你 大多数情况下会看到以换行符结尾的 printf 行。1

使用 fflush 您可以自己刷新缓冲区。所以,我不想要 换行并且还想立即看到文本,使用 fflush(stdout):

for (int i=0; i<=j; i++)
{
    pass[0] = 'A' + i;
    printf("%c", pass[0]);
    fflush(stdout);
}

将解决您的问题。


脚注

1我相信这只适用于stdout,我想我在某处读到 很久以前,我找不到源了。但我发现了这个:https://stackoverflow.com/a/4201325/1480131

关于c - 尝试 printf 进度指示器时 c 循环中的奇怪怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847287/

相关文章:

c - 在 C 中使用 0 和 1 作为 false 和 true

c - 在 do..while 循环中递增 sscanf() 并将行存储到结构中

c - 如何设置将用户输入拆分为多个部分并拆分那些较小部分的 C 函数?

c++ - memset如何通过-1初始化一个整数数组?

javascript - <optgroup> 在 $.each 循环上使用 JSON

java - 使用数组和多种方法进行编码给我带来错误并且无法找出原因

list - Ansible,将一个列表分发到其他列表

c - 将 JPEG 屏幕截图保存为 C 中的 BYTE 缓冲区

c - 在rtems操作系统中解压tar.gz

java - 数组未正确打印