首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在短宽度终端中正确实现连续刷新进度条?

如何在短宽度终端中正确实现连续刷新进度条?
EN

Stack Overflow用户
提问于 2019-08-06 13:57:24
回答 1查看 82关注 0票数 3

我必须向终端写一个自我刷新的进度条--它表示到目前为止已经复制了多少文件。我倾向于每隔1000字节左右刷新一次输出。为了刷新屏幕,我使用了以下概要:

代码语言:javascript
运行
复制
printf("\r"); // clear previous output

// output is the progress bar, percent is an integer (0 to 100)
printf("%s %d file written", output, percent);

当终端很大时,它工作得很好。但是,当终端很小时,整个进度条都放不进去,回车符就不起作用。它只清除可视的单行,而不是整行。我写了一个示例程序来演示:

代码语言:javascript
运行
复制
printf(
    "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"
    "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghi"
    "j");
printf("\rCHECK");

正如您在下图中所看到的,由于终端很小,因此只删除了整个打印输出的一部分。

放置多个回车符没有任何效果。

那么,用C语言构建这样一个连续刷新终端输出的好方法是什么呢?

我也尝试过clear screen (printf("\033[2J");),但它对我不起作用。它倾向于在输出的开头插入任意数量的空格,如下图所示:

EN

回答 1

Stack Overflow用户

发布于 2019-08-06 14:47:46

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

代码语言:javascript
运行
复制
#include <term.h>

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57369721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档