当使用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功能标志的更多相关文章

  1. Angular2 依赖注入

    1. 使用DI 依赖注入是一个很重要的程序设计模式. Angular 有自己的依赖注入框架,离开了它,我们几乎没法构建 Angular 应用.它使用得非常广泛,以至于几乎每个人都会把它简称为 DI. ...

  2. 前端CSS规范整理_转载、、、

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...

  3. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

    刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...

  4. css的命名规则

    本文转载自谈笑涧<css的命名规则> 操作系统版本:Windows 7 浏览器版本:IE6,IE7,IE8,Firefox 3.6.2,Safari 4.0.4,Chrome 5.0.35 ...

  5. [Linux] Linux指令汇总(持续更新中...)

    写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学L ...

  6. class命名

    常见class关键词: 布局类:header, footer, container, main, content, aside, page, section 包裹类:wrap, inner 区块类:r ...

  7. Web前端开发规范手册

    一.规范目的 1.1  概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发.  ...

  8. CSS命名

    CSS命名规范 CSS样式命名整理 页面结构 容器: container/wrap 整体宽度:wrapper 页头:header 内容:content 页面主体:main 页尾:footer 导航:n ...

  9. 常用的css命名规则:

    关于团队合作的css命名规范 常用的css命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制 ...

随机推荐

  1. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  2. 我的AutoCAD二次开发之路 (一)

    原帖地址 http://379910987.blog.163.com/blog/static/33523797201011184552167/ 今天在改代码的时候,遇到了AddVertexAt方法的用 ...

  3. :eq(index)

    匹配一个给定索引值的元素 从 0 开始计数 查找第二行 HTML 代码: <table> <tr><td>Header 1</td></tr> ...

  4. STM32模拟I2C

    之前为了测试, 拿最小板做了一个I2C的主发跟主读, 一开始当然是尝试用硬件I2C, 结果弄了很久, 时间紧迫, 只好用了模拟, 结果发现, 哎, 真特么挺好用的, 现在1片儿顶过去5片儿. 硬件I2 ...

  5. java中的单例设计模式

    单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供 ...

  6. struts2的两个核心配置文件

    struts2的两个核心配置文件,即:struts.default.xml和struts.properties A,位置:都在struts2-core-version.jar文件中 B,作用,stru ...

  7. PHP易混淆函数的区分

    常量定义自定义常量 常量名区分大小写系统的魔术常量不区分大小写 __DIR__ __dir__变量定义变量名是区分大小写变量名声明时用$符号开头, 而且要符合变量名的命名规则$i;var_dump($ ...

  8. JavaEE基础(二十四)/多线程

    1.多线程(多线程的引入) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给 ...

  9. 浮点数转换为人名币读法字符串(JAVA)

    /*<java疯狂讲义>浮点数转换为人名币读法字符串这个用例,感觉没有考虑零的情况*/ import java.util.Arrays; public class Num2Rmb { pr ...

  10. ACM学习之路————一个大整数与一个小整数不得不说得的秘密

    这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...