我必须向终端写一个自我刷新的进度条--它表示到目前为止已经复制了多少文件。我倾向于每隔1000字节左右刷新一次输出。为了刷新屏幕,我使用了以下概要:
printf("\r"); // clear previous output
// output is the progress bar, percent is an integer (0 to 100)
printf("%s %d file written", output, percent);
当终端很大时,它工作得很好。但是,当终端很小时,整个进度条都放不进去,回车符就不起作用。它只清除可视的单行,而不是整行。我写了一个示例程序来演示:
printf(
"abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"
"abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghi"
"j");
printf("\rCHECK");
正如您在下图中所看到的,由于终端很小,因此只删除了整个打印输出的一部分。
放置多个回车符没有任何效果。
那么,用C语言构建这样一个连续刷新终端输出的好方法是什么呢?
我也尝试过clear screen (printf("\033[2J");
),但它对我不起作用。它倾向于在输出的开头插入任意数量的空格,如下图所示:
发布于 2019-08-06 14:47:46
通常,判断消息是否换行到终端的下一行的唯一方法是将其与终端宽度(列数)进行比较。您可以使用terminfo(3)获取该信息
#include <term.h>
int main() {
setupterm(0, 1, 0); /* default terminal setup from the TERM envvar */
现在,您可以访问全局var columns
,以了解终端上有多少列。您还可以使用putp(tigetstr("cuu1"));
在终端上向上移动一行。因此,您可以跟踪您的状态消息有多长,并计算出您需要走多远才能返回到消息的开头。
https://stackoverflow.com/questions/57369721
复制相似问题