移除C语言中的printf输出

6
我希望创建一个小函数,该函数应在控制台中以百分比显示当前状态。该函数只应在一行中显示当前值。 因此,我必须删除最后一个输出。是否可能?最好是使用一些 ANSI C 的东西,程序应在 Linux 和 Windows 上运行。
我已经找到了一些转义序列,例如"\033[J",但它并不起作用。
编辑
好吧,我尝试过:
void PrintProcessBar(int i, int n) {
    float ratio = i / (float)n;    
    printf("%.3d\b\b", (int)(ratio * 100));
    fflush(stdout);
}

但是它只会打印出许多零...发生了什么?如果我使用三个\b,就什么也看不到。 解决方案
float ratio = (i / (float)n) * 100;
printf("\b\b\b\b");
fflush(stdout);
printf("%.3d%c", (int)ratio, 37);        
fflush(stdout);

i = 当前位置。 n = 最大运行次数。

我使用 4 个 \b,因为在第一次调用函数时它将删除 4 个空格。

问候。


2
答案应与问题分开。如果您想回答自己的问题,可以点击此页面底部的[回答您的问题]按钮。 - intcreator
2个回答

15

\b 是回退的转义序列。你可以与空格一起使用它来删除一行。

例如:

printf("98%");
fflush(stdout);
// sleep some time
printf("\b\b\b99%");
fflush(stdout);

这应该打印出 98%,然后将其替换为 99%。


好的,我已经尝试过了,但是出了一些问题。请看我的 编辑。谢谢。问候。 - Andre Hofmeister
你正在打印三个字符,但每次只返回两个,你可能需要返回与打印相同数量的字符(另一个\b应该可以解决)。 - MByD
我写了这句话,如果我使用三个\bprintf就不会打印任何东西。 - Andre Hofmeister
抱歉,我错过了。下一个打印开始时写入如何? - MByD
是的,你说得没错!把它加在最后面没有意义...输出会再次删除它!谢谢。 - Andre Hofmeister

7
你要找的是 \r ,它代表回车符,可以让光标回到当前行的开头。不要使用\n,因为它会换到下一行。
由于 \r 不会删除文本,而只是让你可以覆盖之前的内容,所以你需要确保打印足够多的文本(如果需要,可以使用空格)来清除你想要覆盖的行。

哦,这不是取决于系统吗? - Mr Lister
换行符的使用取决于系统(Linux和Mac使用\n,Windows使用\r\n,Acorn BBC和RISC OS排队文本输出使用\n\r,Commodore 8位机、Acorn BBC、TRS-80、Apple II家族、Mac OS直到版本9和OS-9使用\r来源 - Eregrith
因此,在Mac OS 9及以下版本中,您在执行\r操作时可能会遇到问题。 - Eregrith
呵呵,我用 Mac 进行开发 :)。 - Andre Hofmeister
如果你必须符合“MacOS < 10”的规范,那么你应该像__Binyamin Sharet__的答案中所提示的那样使用\b。如果不遵守标准的mac,则会出现问题。这一次不是IE... - Eregrith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接