我用我的C ++程序下面的几行输出我的模拟的进度信息,
double N=0;
double percent=0;
double total = 1000000;
for (int i; i<total; ++i)
{
percent = 100*i/total;
printf("\r[%6.4f%%]",percent);
}
它工作正常!
但问题是,我看到了终端光标一直通过数字循环闪烁,这是很烦人的,任何人都知道如何摆脱呢?
我见过像wget或Ubuntu容易一些程序,他们所使用的进度条或百分比过,但他们似乎没有闪烁光标的问题,我想知道他们是怎么做到的?
谢谢!
只是一个猜测:尝试使用“\ B”(退格键)字符,而不是“\ r”适当数量。
== ==编辑
我不是一个Linux shell向导,但是这可能工作:
system("setterm -cursor off");
// ...display percentages...
system("setterm -cursor on");
不要忘了#include <cstdlib>
或<iostream>
。
您可以隐藏,并使用显示光标DECTCEM
在(DEC文本光标能模式)模式DECSM
和DECRM
:
fputs("\e[?25l", stdout); /* hide the cursor */
fputs("\e[?25h", stdout); /* show the cursor */
以避免闪烁的光标的一个方法是(所建议的),以暂时隐藏光标。
然而,这仅仅是解决方案的一部分。 你的计划也应考虑到这一点:
- 隐藏光标和修改屏幕,显示在光标前后再次其移回原来的位置。
- 隐藏/显示光标只保留从当你的更新只需要小的时间量显着闪烁的光标。 如果你发生了一些耗时的过程混合这一点,你的光标会闪烁。
使用建议的溶液setterm
不是便携式的; 它是特定于Linux控制台。 并使用运行一个可执行的system
是不是真的有必要。 但是,即使运行
system("tput civis");
...
system("tput cnorm");
超过使用改进setterm
。
检查所述源代码wget
没有找到任何光标隐藏转义序列。 什么你与它的进度栏看到的是,它让光标大致每当它的东西费时同一个地方。 输出到终端需要这么短的时间,你不(通过打印回车,然后再编写大部分线路以上)注意线的瞬间改写。 如果它是速度较慢,则隐藏光标将帮助 - 在一定程度上。
顺便说一句-此光标隐藏技术在终端驱动一些编辑器(VIM和用于恶劣 )。
这些应用程序可能使用ncurses的 。 见mvaddstr
将光标跳到周围的原因是因为stdout
被缓冲,所以你不知道实际上有多少个字符被打印在某个时间点。 究其原因wget
没有一个跳跃的光标是,他们实际上是打印到stderr
来代替。 尝试以下方法:
fprintf(stderr,"\r[%6.4f%%]",percent);
这也有不搞乱如果要保存使用地方,比如管道的输出其余文件的好处是:
$ ./executable > log.data
按Insert键...如果不工作,然后按下键盘上的Fn键。 这肯定会工作
希望这可以帮助