您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C语言如何在终端实现进度条效果?

时间:2021-08-02 11:03:30  来源:  作者:tsalmon3

一 什么是ANSI控制码(ANSI escape sequences)

维基百科给出的解释如下:

ANSI escape sequences are a standard for in-band signaling to control cursor location, color, font styling, and other options on video text terminals and terminal emulators. Certain sequences of bytes, most starting with an ASCII escape character and a bracket character, are embedded into text. The terminal interprets these sequences as commands, rather than text to display verbatim.

标准控制码是一个标准用于规范控制视频文本终端和模拟终端上的光标位置,颜色,字体样式和其他选项的带内信号(笔者注:用于规范带内信号)。这些特定的序列,大都以一个ASCII的 'escape' 字符和一个 '[' 字符开头,并被嵌入到文本中,终端将这些特定的序列解释成命令,而不是显示在屏幕上的文本。

二 CSI (Control Sequence Introducer) sequences

ANSI标准规定 'esc' 字符后面所跟的第一个字符用于标识序列的类型,同时又根据第一个字符的大小将Escape序列分为四个大类:

  • nF Escape Sequence (0x20~0x2F),
  • Fp Escape Sequence (0x30~0x3F),例如:esc [
  • Fe Escape Sequence (0x40~0x5F),例如:esc 7
  • Fs Escape Sequence (0x60~0x7E),例如:esc c

为了不偏离本文的中心,我们这里只关注当 'esc' 后面接 '[' 的情况,当 'esc'后面接 '[' 时我们称之为CSI序列。下面给出几个常用的CSI序列语法(格式中CSI指代esc [)。

格式

说明

CSI n A

光标上移n行

CSI n B

光标下移n行

CSI n C

光标往前移动n字符

CSI n D

光标往后移动n字符

CSI n J

清屏

CSI n K

清行(n取0时,清空光标到行尾的所有字符;当n取1时,清空光标到行尾的所有字符;当n取2时,清空整行的字符,光标位置不变。)

CSI ? 25 h

显示光标

CSI ? 25 I

隐藏光标

 

三 简单案例

案例:实现进度条效果,每秒增长10%

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define BAR_SIZE 10

void progressbar(int sec)
{

    char bar[BAR_SIZE+1] = {0}; /* '\0' */

    for(int j = 1; j <= BAR_SIZE; j++) {
        memset(bar, ' ', BAR_SIZE);
        memset(bar, '>', j);
        printf("[%s]%3d%%", bar, j*10);
        fflush(stdout);
        sleep(sec);
      	/* 33[1K代表清行,33[16D代表光标左移16字符。 */
        printf("\033[1K\033[16D"); ///< 光标回到行首
    }
}

int main(void)
{
    progressbar(1);
}
C语言如何在终端实现进度条效果?

实现效果

 

参考文献

[1] ANSI escape code (http://en.volupedia.org/wiki/ANSI_escape_code)



Tags:C语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  Tags: C语言  点击:(46)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  Tags: C语言  点击:(46)  评论:(0)  加入收藏
前言很多事不深入以为自己懂了,但真正用到项目上,才发现了问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。(...【详细内容】
2021-08-27  Tags: C语言  点击:(82)  评论:(0)  加入收藏
C语言作为高级语言,用其编写的程序指令机器并不能识别,因此需要有一个编译器将其转换为机器可识别的二进制指令。C语言已经出现50多年的时间,其相关的编译器种类众多,从最早先的...【详细内容】
2021-08-24  Tags: C语言  点击:(130)  评论:(0)  加入收藏
一 什么是ANSI控制码(ANSI escape sequences)维基百科给出的解释如下:ANSI escape sequences are a standard for in-band signaling to control cursor location, color, font...【详细内容】
2021-08-02  Tags: C语言  点击:(167)  评论:(0)  加入收藏
字符分类: 宽字符函数普通C函数描述 iswalnum() isalnum() 测试字符是否为数字或字母 iswalpha() isalpha() 测试字符是否是字母 iswcntrl() iscntrl() 测试字符是否是控制符...【详细内容】
2021-07-19  Tags: C语言  点击:(131)  评论:(0)  加入收藏
取消宏定义定义变量的时候,不能够重复定义同名变量;同理,定义宏的时候,不可以重复定义同名的宏。例如:#define MAX 1000#define MAX 50此时,重复定义MAX宏,是不合法的代码。但是,我...【详细内容】
2021-07-13  Tags: C语言  点击:(122)  评论:(0)  加入收藏
函数参数传递指针变量在函数的定义中,函数的参数可以是各种变量,就包括指针变量。首先,我们来看看一个函数的定义:void func(char* p);该函数的名称叫做func,参数定义为 char* p...【详细内容】
2021-07-09  Tags: C语言  点击:(135)  评论:(0)  加入收藏
8 函数嵌套调用我们学习了函数的定义和使用,那么,函数在被调用之前,必须先进行定义或者声明。如下是一个程序测试例子: 程序运行结果如下: 可以看到,在main函数中调用了func函数。...【详细内容】
2021-07-03  Tags: C语言  点击:(342)  评论:(0)  加入收藏
程序输入与输出当我们操作一个linux终端的时候,执行linux命令程序,可以看到命令的输出信息,或者要求输入数据。那么,这些操作就是linux命令程序与用户进行交互。程序与用户的交...【详细内容】
2021-06-23  Tags: C语言  点击:(163)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(0)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(10)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(16)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(46)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(46)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(37)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条