如何在同一行打印'\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;
}
检查下面使用字符\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;
}