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;
}