重写到位 - 标准输出

时间:2010-10-08 04:01:45

标签: objective-c c terminal stdout

因为我正在设置一个新的服务器供我使用,所以我一直在使用很多命令行程序,如curlwget,我注意到他们做了一些事情有趣。当在终端中运行时,它们会打印当前的进度(例如,54%将在55%到位,而不是在下一行打印55% - 下载一个大文件,你会明白我的意思。)

我一直在想程序如何做到这一点。写给stdout对我来说并不是什么新鲜事,但我很困惑这样的事情会起作用。我曾尝试写stdout,然后再向后寻求写作;打印退格字符('\b'),并打印新内容;等等,但似乎没有任何效果。

Objective-C或C中没有API来执行此操作吗? (例如,C有ungetc(),但没有unputc())。 可以实现这个目标吗? 我想更多地了解一些有趣的事情......

谢谢!

4 个答案:

答案 0 :(得分:5)

最常用的方法是使用\r返回行的开头并重写整行,但\b也应该有效。确保您正在呼叫fflush(stdout)。并且不要让光标移动到不同的行,否则重绘会更加痛苦。

答案 1 :(得分:3)

ncurses项目也可能对您感兴趣。一旦你超越了简单的东西,你就会专注于应用程序逻辑的核心,而不是它的演示!

您遇到的几乎所有漂亮的终端UI应用程序都使用GNU ncurses。

答案 2 :(得分:2)

基本上你可以用这样的东西来做:

printf( "progress %3d%%\r", perc );

\ r \ n返回同一行的开头

答案 3 :(得分:0)

S-Lang,被许多人视为ncurses的继承者。