原文链接:https://my.oschina.net/jcseg/blog/178047

开发的一个应用程序选择了终端界面, 为了使软件稍微好看些, 研究下Linux终端的彩色打印, 并且基于这个彩色打印实现了几种进度条, 在此总结下: (更多的是觉得这个东西挺好玩的... )

一. Linux终端色彩打印:

1. 属性介绍:

(1). 来自网络的ANSI属性控制码:

\033[0m                 关闭所有属性
\033[1m                 设置高亮度
\033[4m                 下划线
\033[5m                 闪烁
\033[7m                 反显
\033[8m                 消隐
\033[30m -- \033[37m    设置前景色
\033[40m -- \033[47m    设置背景色
\033[nA                 光标上移n行
\033[nB                 光标下移n行
\033[nC                 光标右移n列
\033[nD                 光标左移n列
\033[y;H                设置光标位置
\033[2J                 清屏
\033[K                  清除从光标到行尾的内容
\033[s                  保存光标位置
\033[u                  恢复光标位置
\033[?25l               隐藏光标
\033[?25h               显示光标

(2). 文字背景色彩数字: (颜色范围:40 - 49)

40:    黑色
41:    深红色
42:    绿色
43:    黄色
44:    蓝色
45:    紫色
46:    深绿色
47:    白色

(3). 文字前景色数字: (颜色范围: 30 - 39)

30:    黑色
31:    红色
32:    绿色
33:    黄色
34:    蓝色
35:    紫色
36:    深绿色
37:    白色

2. 使用例子:

Linux终端会解析这些控制码, 并且依据控制码来设置终端的绘制属性, 所以, 只要输出流中包含ANSI控制码就可以工作, 这里使用linux的echo命令来演示:  (你可以使用任何你熟悉的语言来代替...)

(1). 字体红色输出:

查看上面的ANSI控制码可以知道: \033[30m -- \033[37m是控制前景色, 并且红色使用31表示, 即: 红色ANSI控制码为:  \033[31m

echo -e "\33[31m红色字体\33[0m"     #需要加上-e参数

从\033[31m处开始使用"红色"作为字体的前景色, 后面全部的绘制都使用红色, 直到遇到属性关闭控制码. 所以: 后面使用\033[0m来关闭属性, 要不然终端后面的输入的文字将全部是红色的. 效果图:

(2). 使用多个控制码产生叠加效果:  红色+高亮

echo -e "\033[31m\033[1m红色+高亮\033[0m"   #高亮控制码为: \033[1m

效果:

(3). 红底+白字+高亮+下划线:

echo -e "\033[41m\033[37m\033[1m\033[4m红底+白字+高亮+下划线\033[0m"

效果:

多个控制码可以一起使用, 从而看到叠加的效果, 控制码之间的顺序无所谓, 例如: 上面的高亮和下划线.  其他的控制码就可以自己试试了.

二. Linux终端进度条的实现:

了解了上面的Linux终端彩色打印, 就可以开始做出漂亮的终端进度条了.

1. 利用\r backspace符来制作进度条:

(1). 一个php例子如下:  (注意, php要使用printf, echo没用的)

<?php
for ($i = 0; $i <= 50; $i++) {printf("mprogress: %d%% %s\r", $i * 2, str_repeat('#',$i) );usleep(1000 * 100);
}
echo "\n", "Done.\n";
?>

运行效果如下:

(2). 加上色彩:

(3). 进一步美化, 使用背景并且使用空格代替'#'字符:

<?php
for ($i = 0; $i <= 50; $i++) {printf("mprogress: \033[41m\033[1m %d%% %s\r\033[0m", $i * 2, str_repeat(' ',$i) );usleep(1000 * 100);
}
echo "\n", "Done.\n";
?>

效果:

哈, 效果还不错呢.

(4). 终极美化, 将光标隐藏:

这个只要在里面加上隐藏光标的ANSI控制码就ok了, 不过记得要在后面将光标回复显示, 要不然后面终端就看不到光标了:

<?php
for ($i = 0; $i <= 50; $i++) {printf("\033[?25lmprogress: \033[41m\033[1m %d%% %s\r\033[0m", $i * 2, str_repeat(' ',$i) );usleep(1000 * 100);
}
printf("\nDone.\n\033[?25h");
?>

效果:

到此Linux终端进度条制作完毕.

三. 一个C的进度条封装:

1. progress.h头文件:

/*** linux terminal progress bar (no thread safe).*    @package progress.h.** @author chenxin <chenxin619315@gmail.com>*/
#ifndef progress_h
#define progress_h#include <stdio.h>typedef struct {char chr;     /*tip char*/char *title;    /*tip string*/int style;        /*progress style*/int max;      /*maximum value*/float offset;char *pro;
} progress_t;#define PROGRESS_NUM_STYLE 0
#define PROGRESS_CHR_STYLE 1
#define PROGRESS_BGC_STYLE 2extern void progress_init(progress_t *, char *, int, int);extern void progress_show(progress_t *, float);extern void progress_destroy(progress_t *);#endif  /*ifndef*/

2. progress.c 源程序:

/*** linux terminal progress bar (no thread safe).*    @package progress.c** @author chenxin <chenxin619315@gmail.com>*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include "progress.h"/*** initialize the progress bar.* @max = 0* @val = 0** @param style* @param  tip words.*/
extern void progress_init( progress_t *bar, char *title, int max, int style)
{bar->chr = '#';bar->title = title;bar->style = style;bar->max = max;bar->offset = 100 / (float)max;bar->pro = (char *) malloc(max+1);if ( style == PROGRESS_BGC_STYLE )memset(bar->pro, 0x00, max+1);else {memset(bar->pro, 32, max);memset(bar->pro+max, 0x00, 1);}
}extern void progress_show( progress_t *bar, float bit )
{int val = (int)(bit * bar->max);switch ( bar->style ) {case PROGRESS_NUM_STYLE:printf("\033[?25l\033[31m\033[1m%s%d%%\033[?25h\033[0m\r",bar->title, (int)(bar->offset * val));fflush(stdout);break;case PROGRESS_CHR_STYLE:memset(bar->pro, '#', val);printf("\033[?25l\033[31m\033[1m%s[%-s] %d%%\033[?25h\033[0m\r", bar->title, bar->pro, (int)(bar->offset * val));fflush(stdout);break;case PROGRESS_BGC_STYLE:memset(bar->pro, 32, val);printf("\033[?25l\033[31m\033[1m%s\033[41m %d%% %s\033[?25h\033[0m\r", bar->title, (int)(bar->offset * val), bar->pro);fflush(stdout);break;}
}//destroy the the progress bar.
extern void progress_destroy(progress_t *bar)
{free(bar->pro);
}

3. tst-pro.c测试程序:

/*** program bar test program.** @author chenxin <chenxin619315@gmail.com>*/
#include "progress.h"
#include <unistd.h>int main(int argc, char *argv[] )
{progress_t bar;//progress_init(&bar, "", 50, PROGRESS_NUM_STYLE);progress_init(&bar, "", 50, PROGRESS_CHR_STYLE);//progress_init(&bar, "", 50, PROGRESS_BGC_STYLE);int i;for ( i = 0; i <= 50; i++ ) {progress_show(&bar, i/50.0f);sleep(1);}printf("\n+-Done\n");progress_destroy(&bar);return 0;
}

4. 测试效果:

(1). PROGRESS_NUM_STYLE效果:

(2). PROGRESS_CHR_STYLE效果:

(3). PROGRESS_BGC_STYLE效果:

Linux终端彩色打印+终端进度条相关推荐

  1. linux编译项目的命令,Linux用make指令编译进度条程序

    本文实例为大家分享了Linux下写一个简单进度条的具体代码,供大家参考,具体内容如下 首先建立一个新的文件,touch progress_bar.c 执行该vim progress_bar.c命令,写 ...

  2. Linux 浅谈代码打印到终端的缓冲区(进度条程序)

    我们知道printf是向终端显示打印数据,是我们想要看到程序的结果,而在linux系统下一切皆文件,在终端显示是要有显示器设备的,在linux下把显示器设备当做文件进行操作,将数据写入到显示器设备文件 ...

  3. linux各种小程序源码,Linux中的小程序—— 进度条

    在说正事之前,首先科普一下在什么是回车什么是换行? 我们通常所说的回车就是从一行的末尾跳到另一行的开头,但事实上这却是由回车和换行两个动作所完成的,也就是键盘上所完成的工作.但实际上,回车是光标重回开 ...

  4. Linux环境下实现简单进度条

    进度条是我们生活中可见的,但是大家却从来不知道其怎么实现的,下面就是linux环境下的进度条的简单实现 这里应该提一下缓冲区的概念: 计算机中的缓冲区: 缓冲器为暂时置放输出或输入资料的内存. 缓冲器 ...

  5. linux断电关机后,进度条满后卡在那里

    系统 :CentOS 6.5 故障:系统启动后,进度条满了,但是不显示登陆提示符 解决方法: 1.重启后按 esc 或 f5 键,可以查看系统启动过程 可以发现,在certomonger 启动 OK ...

  6. linux启动系统不显示进度条设置方法

    编辑启动grub配置文件: # vi /boot/grub/grub.conf  或   /etc/grub.conf   软连接文件,2个文件内容是一样的. 删除kernel行最后的"rh ...

  7. C语言实现进度条彩色变化

    [C语言]实现一个变色的进度条 原创 2017年03月31日 20:39:30 标签: linux / C语言 / 376 编辑 删除 实现一个如上的进度条 要求 1.依次多打印一个'#' 2.并后面 ...

  8. html打印进度条不显示,LODOP打印URL显示和隐藏进度条

    不建议使用ADD_PRINT_URL: 由于Lodop借用IE下载引擎,与非IE浏览器之间目前不能传递Session(Cookies),所以需要安全验证的页面不要用URL方式打印,要用页面已经下载好的 ...

  9. 用python画派大星代码_Python多线程处理数据,并打印进度条

    multiprocessing 与 threading对比 这两个库都可以实现多线程操作,而且因为多线程的思路其实差不多,所以提供的API也比较类似,但是本地实际测试中,发现multiprocessi ...

最新文章

  1. CentOS 5.5 手动安装 GCC4.6.2
  2. 研究人工智能最应该注意的问题
  3. jQuery仿淘宝商城天猫鼠标移动过去,透明度降低
  4. Bug访问豆瓣403forbidden
  5. Indetifier
  6. 我回答的一个粉丝关于用编程语言模拟SAP事务的问题
  7. 天涯明月刀开发_《天涯明月刀OL腾讯旗下 北极光工作室的 厄运魔咒:“做什么凉什么”》...
  8. 焊接符号标注图解示例_【干货】焊接图纸符号汇总 ,学习收藏!!
  9. Polly-故障处理和弹性应对很有一手
  10. 【youcans 的 OpenCV 例程 200 篇】105. 湍流模糊退化模型
  11. Dubbo(十二)dubbo的服务版本配置以及本地存根使用介绍
  12. C++ 入门5 ---- 类和动态内存分配(一)
  13. ffplay源码编译
  14. 中国石油大学计算机第二阶段在线作业,中国石油大学计算机应用基础第二阶段在线作业答案2018年...
  15. 计算机专业论文答辩ppt,计算机毕论文答辩PPT(完整版).ppt
  16. DiskGenius分区助手,5.1.2.766绿色单文件版更新上传
  17. python 多行注释语法_Python 注释-Python注释多行代码-Python注释符-python多行注释-嗨客网...
  18. PHP array_column() 函数
  19. 八爪鱼采集ajax表格,设置八爪鱼采集器ajax延时采集分页列表的方法
  20. 亲历骗子通过闲鱼、江苏猎宝网络科技股份有限公司进行诈骗!

热门文章

  1. php中怎么写分页符,在pdf文档中插入手动分页符-PHP
  2. 专访张银奎:要抓住技术发展趋势,只有不断学习和更新自己?
  3. 随想005:调试的思考
  4. 40年来各个顺位上的最佳球员(转)
  5. 中英文混排的括号选择问题
  6. 通过交互式网页爬取,抓取天猫商品价格
  7. RTOS之必备汇编指令(老干妈笔记)
  8. 计算机音乐盗将行乐谱,天谕手游乐谱盗将行代码
  9. 我的青春里有你的爱 ——《将爱》影评
  10. 感恩工作平台心得体会_关于感恩的工作心得体会