gpt4 book ai didi

c - 如何在短宽度终端中正确实现持续刷新的进度条?

转载 作者:行者123 更新时间:2023-12-04 09:40:52 24 4
gpt4 key购买 nike

我必须在终端上写一个 self 刷新的进度条——它表示到目前为止已经复制了多少文件。我倾向于每 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");

如下图所示,由于终端很小,所以只删除了整个打印输出的一部分。

enter image description here

放多个回车没有效果。

那么,在C中构建这样一个不断刷新的终端输出有什么好的方法呢?

我也试过清除屏幕 (printf("\033[2J");) 但它对我不起作用。它倾向于在输出的开头插入任意数量的空格,例如图片:

enter image description here

最佳答案

通常,判断您的消息是否换行到终端的下一行的唯一方法是将其与终端宽度(列数)进行比较。您可以使用 terminfo(3) 获取该信息

#include <term.h>

int main() {
setupterm(0, 1, 0); /* default terminal setup from the TERM envvar */

现在您可以访问全局变量 columns 以了解终端上有多少列。您还可以使用 putp(tigetstr("cuu1")); 在终端上上一行。因此,您可以跟踪您的状态消息有多长,并计算出您需要走多远才能回到消息的开头。

关于c - 如何在短宽度终端中正确实现持续刷新的进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57369721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com