我以前写过一篇文章Linux C/C++ 如何输出彩色字体
点击链接即可传送
这里我再加两个常用的控制字符\n
和\r
有人会问,这两个不久换行符嘛,有什么好讲的。其实不然。
系统 | 终端换行符 |
---|---|
Windows | \r\n |
Linux | \n |
Mac OS | \r |
有人又会问,不对呀,我在C/C++中都用\n
作换行符的,怎么没报错?其实编译器作了特殊优化。
那么\r
和\n
到底有什么区别呢?
\r
代表光标移动到行首,\n
代表光标向下移动
看到这里,我想大家也明白了,Windows的换行符是最标准的
先将光标移动至行首,再下移一行
但我的重点不是换行符,而是\r
有的人可能知道退格符\b
,意思是把光标倒退一格
这个控制字符在一些情况下十分有用,比如vim
八成是这么干的,但如果要显示进度条,怎么退到行首呢?
这个时候,\r
登场了。终端对输出的处理是覆盖本行后面的字符(如果有的话)
于是只要新的输出大于等于原来的输出,就可以做到更新进度条。
std::cout << "Hello world!\rThis is a new sentence!" << std::endl;
这句话输出很明显,应该是This is a new sentence!
但如果换一个,std::cout << "Hello world!\rHello!" << std::endl;
你会发现,输出不是Hello!
而是Hello!world!
因为终端不会把本行的所有字符都删除,而是用类似Insert的模式去输出。
那么这个时候,打开Linux C/C++ 如何输出彩色字体,找到\033[K
这一行,这个控制字符串就可以帮助你删除本行光标后的内容,可以配合\r
使用(仅限于Linux,对于其他操作系统,会将那一串全部输出)
到这里,进度条已经可以实现了。但是我在测试的时候发现了问题,因为更新过于频繁,会导致光标不断在那一行闪动,影响视觉效果。这个时候,再次点击传送门,发现控制字符串\033[?25l
可以隐藏光标,而控制字符串\033[25h
可以重新显示。这就非常好了,只要在输出的开始时隐藏光标,在结束时显示光标就行了。
那么至此,你结合表格(传送门内),就可以实现apt
的进度条了(Progress
那个只需要在输出开始先光标下移\n
,在输出结束光标上移\033[1A
就行了)