如何在同一行打印'\r'重定向标准输出?

How to redirect stdout with '\r' printed on the same line?

检查下面使用字符\r的代码片段:

#include <stdio.h>
#include <unistd.h>
int main() {
    for(int i=1; i<=100; i++) {
        printf("%d%%\r", i);
        fflush(stdout);
        usleep(1e4);
    }
    printf("\n");
    return 0;
}

这个程序在控制台的输出只有1行:

$ ./main
100%

然而,如果输出被重定向到一个文件 ./main > main.log,该文件有 100 行:

1%
2%
3%
...
100%

问题:

如何只保留最后一行输出到日志文件?

我假设这是一个更大程序的一部分,其中 "percentage" 可能是也可能不是 100%(否则,您可以立即打印 100%)。 因此,您可以使用 isatty 检查输出是否进入终端。如果不是,打印 "last percentage" 值:

int main(void)
{
    int b = isatty(STDOUT_FILENO);
    int i;
    for(i=1; i<=100; i++) {
        if (b) printf("%d%%\r", i);
        fflush(stdout);
        usleep(1e4);
    }
    if (!b) printf("%d%%\r", i-1);
    printf("\n");
    return 0;
}