一个使用 ANSI.SYS Escape Sequences 进行时间显示的例子
2008-07-11 16:14
399 查看
#include <stdio.h> #include <time.h> #include <memory.h> #include <string.h> #include <unistd.h> int main(void) { time_t t_time; char *a_time; char *day; char *hour; day=(char*)malloc(15); hour=(char*)malloc(15); printf ("/033[2J"); if ( fork () ) exit(0); while (1) { printf("/33[s"); time (&t_time); a_time=asctime(localtime(&t_time)); bzero(day,15); bzero(hour,15); memcpy(day, a_time, 10); memcpy(hour, a_time+10, 10); printf("/033[1;45H/033[K +-----------------------+"); printf("/033[2;45H/033[K + net_robber tell you: +"); printf("/033[3;45H/033[K + %s +",day); printf("/033[4;45H/033[K + %s +",hour); printf("/033[5;45H/033[K +-----------------------+"); printf("/33[u"); fflush(stdout); sleep(1); } }
ANSI ESCAPE SEQUENCES实例掌握
/*------------CopyRight------------- Name:ANSI ESCAPE SEQUENCES实例掌握 Version Number:1.0 Type:Article Date:2005-08-06 Author:BitBull Email:bitbull.cn(at)gmail.com --------------------------------------------*/ 0.想在单调的文本模式下写出五彩的程序吗?想让游标如您所愿的游走于屏幕任意地方吗? 这些只需要对ANSI ESCAPE SEQUENCES有点了解就能轻松办到,ANSI ESCAPE SEQUENCES又称为VT100系列控制码,国内译为ANSI控制码.顾名思义,需要VT100系列终端的支持,当然现在已经不在局限于VT100了,包括xterm,linux都能很好完成.(注:在linux下使用困难请man terminfo或termcap取得帮助,在DOS或Windows下,在config.sys中加入ansi.sys(或nansi)即可.) 文章里涉及测试均在以下系统里测试通过: Red Hat Enterprise Linux AS release 4 (Nahant) GNU/Linux kernel 2.6.9 GNU bash 3.00.15 80 X 24终端 1.做了简单的介绍后,我们从ANSI控制码的Set Graphics Rendition讲起,先来做个小演示 echo -ne "/33[31m" 终端字符是不是变红色了?这里echo只作为设置用,printf等命令都可代替. ANSI控制码开始的标志都为ESC[,"ESC"对应ASCII码表的033(八进制),所以我们刚才用-e启用转义,/33来输入ESC,/33[31m即为ESC[31m. 如果不想使用转义,可直接输入,方法:ctrl-v,按ESC ┏━━━┳━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 前景 ┃ 背景 ┃ 颜 色 ┃ ┣━━━╋━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ 30 ┃ 40 ┃ 黑色 ┃ ┃ 31 ┃ 41 ┃ 红色 ┃ ┃ 32 ┃ 42 ┃ 绿色 ┃ ┃ 33 ┃ 43 ┃ 黄色 ┃ ┃ 34 ┃ 44 ┃ 蓝色 ┃ ┃ 35 ┃ 45 ┃ 紫红色 ┃ ┃ 36 ┃ 46 ┃ 青蓝色 ┃ ┃ 37 ┃ 47 ┃ 白色 ┃ ┗━━━┻━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 我们可以把前景和背景色一起来设置(ESC[X;X;....;Xm,X替换具体色码) echo -ne "/33[31;46m" ANSI控制码除了颜色,还提供了一些"特效"喔, :-) ┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 代 码 ┃ 功 能 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ 0 ┃ 所有属性 OFF,即返回正常显示模式 (Normal) ┃ ┃ 1 ┃ 高亮度显示 (Bright) ┃ ┃ 4 ┃ 加下划线 (Underline) ┃ ┃ 5 ┃ 闪烁显示 (Flash) ┃ ┃ 7 ┃ 反相显示 (Inverse) ┃ ┃ 8 ┃ 不可见 (Invisable) ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ clear 试一试: echo -ne "/33[5;32;45m" HOHO~这里只为说明问题,颜色搭配确实很糟糕,各位自己来 要取消定义用 echo -ne "/33[0m" 记得把终端还原,再来做下面的例子 如果只要把用echo或printf输出的字符上色,其他终端颜色不改变,可以用类似 echo -e "/33[32mHello LinuxWorld/33[0m" 这次效果是不是还不错? Set Graphics Rendition除了上面这些,官方文档还有下面控制码 ESC[=#;7h or Put screen in indicated mode where # is ESC[=h or 0 for 40 x 25 black & white ESC[=0h or 1 for 40 x 25 color ESC[?7h 2 for 80 x 25 b&w 3 for 80 x 25 color 4 for 320 x 200 color graphics 5 for 320 x 200 b & w graphics 6 for 640 x 200 b & w graphics 7 to wrap at end of line ESC[=#;7l or ESC[=l or Resets mode # set with above command ESC[=0l or ESC[?7l 这些都为不常用的终端属性控制,各位有需要可自行设置,这里不做一一介绍. 2.下面我们来讲讲ANSI控制码的另一块比较常用的功能,Cursor Controls clear echo -ne "/33[10;40H" #把游标移动到第10行,第40列 echo -ne "/33[3A" #上移3行 echo -ne "/33[3B" #下移3行 echo -ne "/33[3C" #左移3列 echo -ne "/33[3D" #右移3列 echo -e "/33[10;40HHello LinuxWorld" #把字符显示在特定位置,其他ABCD控制可类似操作 echo -ne "/33[6n" #报告游标坐标,参阅官方文档是"ESC[#;#R Reports current cursor line & column",不知道是系统差异还是手头的官方文档滞后了 echo -ne "/33[s" #保存当前游标位置 echo -ne "/33[u" #把刚才已经保存的游标位置恢复 游标控制就这么些指令,这里来作个汇总 ┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 控 制 码 ┃ 功 能 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [X;YH ┃ 将游标移至第 X 行 Y 列的位置 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [nA ┃ 游标上移 n 行 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [nB ┃ 游标下移 n 行 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [nC ┃ 游标向右 n 列 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [nD ┃ 游标向左 n 列 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [6n ┃ 报告游标位置。(手头的官方档为[#;#R) ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [s ┃ 保存当前游标位置 ┃ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ [u ┃ 把刚才已经保存的游标位置恢复 ┃ ┗━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 3.Cursor Controls和Graphics Rendition的结合 clear echo -ne "/33[5;31;42m/33[13;30HWarning:XXXXXXXXXXX/33[0m" #通过上面的介绍,这句应该很容易看懂,效果是不是还不错 其他大家自己举一反三,结合ascii art,能做出多彩的字符画 4.Erase Functions echo -ne "/33[2J" #擦除屏幕,和clear命令效果一样 echo -ne "/33[K" #擦除到行尾 5.接下来,我们要讲的是Keyboard Reassignments 这其实是个挺有意思的功能,键盘重赋值 ESC[65;81p #把ASCII码表的65的A变成81的Q,注意这里的数字为10进制 Fn按键对应的ASCII表: F1=59,F2=60,F3=61,F4=62,F5=63 F6=64,F7=65,F8=66,F9=67,F10=68 6.最后,谈谈ANSI控制码的用途 由于ANSI ESCAPE SEQUENCES倚赖终端,不是倚赖语言,所以在shell,perl,c里应用都没有问题 这里给个C实例,基本没啥变化 #include <stdio.h> main() { printf("/33[32mHello LinuxWorld/33[0m/n"); } 编译看看,和echo的效果是不是一样 至于ANSI控制码到底能干嘛,这也要靠读者发挥自己的想像喽,比如把终端打扮得漂亮点,或者写漂亮点的文本游戏,把警告等提示信息用红色加强..................太多太多了 很高兴您能看到这里,希望文章有您需要的东西. 转载请保持版权声明完整,谢谢
相关文章推荐
- 一个使用 ANSI.SYS Escape Sequences 进行时间显示的例子
- 一个使用GridView显示数据,并且可以进行添加、修改、删除操作的例子
- 关于一个使用正则表达式匹配来写的显示时间的方法
- 使用jmeter进行接口压力测试的一个简单例子
- 使用一个Activity进行所有界面的显示,观察者模式实现标题与底部根据中间页面的改变而改变
- Matlab定点化仿真的一个例子:使用CIC滤波器进行数字上变频的仿真
- 使用jdbc连接ORACLE数据库进行查询的一个例子
- 在批处理中使用ping命令,一个小例子进行分析
- 一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)
- Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good
- 在看官方的例子时候由一个grid实例,在每一行之前有个加号,展开可以显示内容,在实际应用中还是非常有用的,照搬例子的代码,发现老是提示对象不存在,查阅资料后发现是没有加载插件,这里和大家分享下Ext.grid.RowExpander插件的使用,
- Android中一个动态更新时间并显示的小例子
- 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子
- 使用js显示一个电子钟表时间19:06:04
- 使用AngularJS 进行Hybrid App 开发已经有一年多时间了,这里做一个总结
- 一个显示系统时间的例子
- 一个使用高德地图SDK进行逆地理编码的例子
- lucene使用IKAnalyzer3.2.8中文分词器进行索引的一个小例子
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算
- 发一个使用 GridView 对数据小类进行分别汇总的例子