zoukankan      html  css  js  c++  java
  • 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 ", 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;
    }

  • 相关阅读:
    Java中的多线程你只要看这一篇就够了
    用Spring Boot颠覆Java应用开发
    Java Web 学习路线
    Java基本概念(2)J2EE里面的2是什么意思
    Java基本概念(1)什么是Java
    《Effective Java》读书笔记一(创建与销毁对象)
    Java:集合,对列表(List)中的数据(整型、字符串、日期等)进行排序(正序、倒序)的方法;字符串按照整型排序的方法
    Java:几个正则式应用(检查汉字、日期、EMAIL、手机号码的合法性,替换字符串等)
    Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)
    Oracle删除重复记录只保留一条数据的几种方法
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/5340519.html
Copyright © 2011-2022 走看看