C 如何使用'重定向标准输出\r';打印在同一行上?

C 如何使用'重定向标准输出\r';打印在同一行上?,c,stdout,carriage-return,C,Stdout,Carriage Return,检查下面使用字符的代码段\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; } 但是,如果将输出重定向到文件/main>

检查下面使用字符的代码段
\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;
}
但是,如果将输出重定向到文件
/main>main.log
,则该文件有100行:

1%
2%
3%
...
100%
问题


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

我假设这是一个较大程序的一部分,其中“百分比”可能是100%,也可能不是100%(否则,您可以立即打印100%)。 因此,您可以使用检查输出是否发送到终端。如果不是,则打印“最后百分比”值:

int main(无效)
{
int b=isatty(标准文件号);
int i;

对于(i=1;我不写入
stdout
。打开
“/dev/tty”
作为一个文件写入,它不会被重定向。如果使用
cat
打印文件,它应该以相同的方式显示,但当然额外的数据仍然存在,它只是在终端上被覆盖。您无法取消写入标准输出的数据。请注意,
\r
实际上不会删除前一行,因此它的一部分将显示新行是否较短。如果您
cat main.log
,当然,它将包含100行,但它将只显示
100%
,与您的终端相同。@leedinelcrocker:我想OP希望更新文件,他们只希望中间结果和最终结果与控制台上的结果相同。在在这种情况下,OP需要学习使用
seek()
1%
2%
3%
...
100%
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;
}