5.5.3使用terminfo功能标志
当使用terminfo时,需要做的第一件事就是调用函数setupterm来设置终端类型。这将为当前的终端类型初始化一个TERMINAL结构。然后,你就可以查看当前终端的功能标志并使用他们的功能了。
#include <term.h>
int setupterm(char *term, in fd, int *errret);
-----------------------------------------------------
1、清屏功能;2、在屏幕上移动光标并将数据写入到屏幕的不同位置。
在成功调用setupterm函数之后,可以通过下面的三个函数调用来访问terminfo的功能标志。
int tigetflag(char* capname); 返回terminfo中的布尔功能标志的值
int tigetnum(char* capname); 返回terminfo中的数值功能标志的值
char* tigetstr(char* capname); 返回terminfo中的字符串功能标志的值
------------------------------------------------------------
下面程序使用terminfo数据库来查找当前终端的显示区大小
在编译程序时需要链接库 -lncurses
安装库:sudo apt-get install libncurses5-dev
#include <stdio.h>
#include <termios.h>
int main()
{
int nrows;
int ncolumns;
setupterm(NULL, fileno(stdout), (int*)0);
nrows = tigetnum("lines");
ncolumns = tigetnum("cols");
printf("nrows=%d ncolumns=%d\n", nrows, ncolumns);
return 0;
}
-------------------------------------
下面三个重要的函数:
#include <term.h>
char* tparm(char* cap, long p1, long p2, ..., long p9);
int putp(char* const str);
int tputs(char* const str, int affcnt, int (*putfunc) (int));
-------------------------------
实现移动光标的功能:
使用tigetstr函数来获取xterm终端类型的光标移动功能标志cup的值,得到一个参数化的结果\E[%p1%d;%p2%dH
这个功能标志需要有两个参数:光标移动到的行号和列号。这个两个坐标都是从0开始计算的,(0,0)表示屏幕的左上角
使用 tparm 函数用实际的数值替换功能标志中的参数,一次最多可以替换9个参数,并返回一个可用的escape转义序列
当用tparm函数构造好终端的escape转移序列后,你必须将其发送到终端,使用函数putp或者tputs将字符串发送到终端,不能使用printf函数。
函数调用putp(string)就等同于函数调用tputs(string, 1, putchar)
tputs函数是为了不能通过标准输出stdout访问终端的情况准备的,它可以指定一个用于输出字符的函数。
----------------
移动光标
测试代码:
#include <stdio.h>
#include <termios.h>
int main()
{
char* cursor;
char* esc_sequence;
setupterm(NULL, fileno(stdout), (int*)0);
cursor = tigetstr("cup");
esc_sequence = tparm(cursor,50, 50);
putp(esc_sequence);
return 0;
}
----------------------------------------------
清除屏幕
#include <stdio.h>
#include <termios.h>
int main()
{
char* clear;
char* esc_sequence;
setupterm(NULL, fileno(stdout), (int*)0);
clear = tigetstr("clear");
putp(clear);
return 0;
}
另一种使用方法:
#include <stdio.h>
#include <termios.h>
static FILE* output_stream = (FILE*)0;
static int char_to_terminal(int char_to_write);
int main()
{
char* clear;
char* esc_sequence;
output_stream = fopen("/dev/tty", "w");
setupterm(NULL, fileno(stdout), (int*)0);
clear = tigetstr("clear");
tputs(clear, 1, char_to_terminal);
return 0;
}
int char_to_terminal(int char_to_write)
{
if (output_stream)
{
putc(char_to_write, output_stream);
}
return 0;
}
5.5.3使用terminfo功能标志的更多相关文章
- Angular2 依赖注入
1. 使用DI 依赖注入是一个很重要的程序设计模式. Angular 有自己的依赖注入框架,离开了它,我们几乎没法构建 Angular 应用.它使用得非常广泛,以至于几乎每个人都会把它简称为 DI. ...
- 前端CSS规范整理_转载、、、
一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...
- WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)
刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...
- css的命名规则
本文转载自谈笑涧<css的命名规则> 操作系统版本:Windows 7 浏览器版本:IE6,IE7,IE8,Firefox 3.6.2,Safari 4.0.4,Chrome 5.0.35 ...
- [Linux] Linux指令汇总(持续更新中...)
写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学L ...
- class命名
常见class关键词: 布局类:header, footer, container, main, content, aside, page, section 包裹类:wrap, inner 区块类:r ...
- Web前端开发规范手册
一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. ...
- CSS命名
CSS命名规范 CSS样式命名整理 页面结构 容器: container/wrap 整体宽度:wrapper 页头:header 内容:content 页面主体:main 页尾:footer 导航:n ...
- 常用的css命名规则:
关于团队合作的css命名规范 常用的css命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制 ...
随机推荐
- 背包问题(Knapsack problem)采用动态规划求解
问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示:0李子4KGNT$45001苹果5KGNT$57002橘子2 ...
- Awk使用一例:获取ASCII可见字符
要做一个需求, 支持可见特殊字符的密码设置. 首先, 需要获取到所有可见特殊字符. 到网上搜索到 ASCII 字符表格, 并复制到文本文件 vschars.txt: 00 00 0 nul 100 4 ...
- 161124、Java 异常处理的误区和经验总结
本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...
- 调用css时,用link 和 @import url 有什么区别
加载css link与@import的区别: 其实 link 与 @import 在显示效果上还是有很大区别的,基本上来看 link 的加在会在页面显示之前全部加在完全,而 @import 会是读取完 ...
- java中的单例设计模式
单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供 ...
- YTU 2987: 调整表中元素顺序(线性表)
2987: 调整表中元素顺序(线性表) 时间限制: 1 Sec 内存限制: 2 MB 提交: 1 解决: 1 题目描述 若一个线性表L采用顺序存储结构存储,其中所有元素都为整数.设计一个算法,将所 ...
- java中两种单例模式
//懒汉式(线程不安全) class LazySingleton{ private static LazySingleton singleton; private LazySingleton(){} ...
- mybatis+springMVC新感悟
一直以为按照例子里写的.先编写User实体类,之后在编写User.xml之后在配置文件里指明接口文件.然后在controller中就可以通过就可以通过定义接口,在取值 IUserOperation u ...
- Unity-Animator深入系列---deltaPosition&deltaRotation
回到 Animator深入系列总目录 官方文档给出的信息非常含糊 Gets the avatar delta position for the last evaluated frame. 测试了一下, ...
- 查看Mac电脑的开机记录
回家以后,发现电脑前的地面上有烟灰.我记不住是不是我抽烟时掉的了.当然,如果不是我掉的,就是别人掉的了.要是别人掉的,估计是坐在我这玩儿电脑的时候掉的了.查一下开机记录吧.打开终端,输入“last|g ...