curses 函数库提供了终端无关的方式来编写全屏幕的基于字符的程序。curses 还可以管理键盘,提供了一种简单易用的非阻塞字符输入模式。

curses 函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。

curses 函数库有多种不同的实现版本。Linux 使用的是 ncurses(new curses),可以使用 sudo apt-get install libncurses5-dev 安装。

在编译时使用 -lncurses 选项来链接 curses 函数库

gcc hello.c -lncurses
 1 #include <ncurses.h>
2
3 int main()
4 {
5 initscr();
6 move(5, 15);
7 printw("%s", "hello world");
8 refresh();
9 getch();
10 endwin();
11 return 0;
12 }

运行后显示如下:

curses 的概念

curses 例程工作在屏幕、窗口和子窗口上。所谓屏幕就是你正在写的设备(通常是终端屏幕,也可能是xterm屏幕)。屏幕占据了设备上全部的可用显示面积,当然,如果设备是X视窗中的一个终端窗口,则屏幕就是该终端窗口内所有可用的字符位置。无论何时,至少存在一个 curses 窗口,我们称之为 stdscr,它与物理屏幕的尺寸完全一样。你可以创建一些尺寸小于该屏幕的窗口,窗口可以互相重叠,它们还可以拥有自己的多个子窗口,但每个子窗口必须总是被包含在它的父窗口内。

curses 函数库用两个数据结构来映射终端屏幕,它们是 stdscr 和 curscr。两者中,stdscr 更重要,它会在 curses 函数产生输出时被刷新。stdscr 数据结构对应的是“标准屏幕”,是 curses 程序中默认输出窗口。curscr 数据结构和 stdscr 类似,但它对应的是当前屏幕的样子。在程序调用 refresh 函数之前,输出到 stdscr 上的内容不会显示在屏幕上。curses 函数库在调用 refresh 函数时比较 stdscr(屏幕将会是什么样子) 和 curscr(屏幕当前时什么样子)之间的不同之处,然后根据这个差异来刷新屏幕。

逻辑屏幕的布局通过一个字符数组来实现,它以屏幕的左上角——坐标(0,0)为起点,通过行号和列号来组织。所有的 curses 函数使用的坐标都是 y 值(行号)在前,x 值(列值)在后。

示例详解:

WINDOW *initscr(void);

initscr 函数将终端屏幕初始化为 curses 模式,它用来清除屏幕上所有的字符,并等待下一步处理。所以在调用其它的 curses 函数前,要先调用 initscr() 函数初始化屏幕。如果成功,返回一个指向 stdscr 结构的指针;如果失败,输出一条诊断错误信息并使程序退出。

int move(int new_y, int new_x);

move 函数用来把逻辑光标的位置移动到指定地点。

int printw(char* format, ...);

采用与 printf 函数相同的方法对字符串进行格式化,然后将其添加到光标的当前位置。

int refresh(void);

当使用 printw 函数打印时,字符串实际上是打印到 stdscr 的虚拟窗口上,没有直接输出到屏幕,而是在 stdscr 的缓冲区中。为了显示这些缓冲区中的数据,必须使用 refresh() 函数告诉 curses 系统将缓冲区的内容输出到屏幕。

int getch(void);

获取一个字符。

int endwin(void);

退出 curses 模式,释放 curses 子系统和相关数据结构占用的内存。

使用 curses 函数库管理基于文本的屏幕的更多相关文章

  1. curses库--libncurses5-dev--游标移动及屏幕的显示

    curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形. curses的名字起源于"cursor optimization" ...

  2. Linux学习笔记13——使用curses函数库

    一 安装curses库 如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev,然后就会自动安装curses库,安装好之后敲入命令 ...

  3. linux curses函数库

    fedora20,安装yum install ncurses-devel 编译时:-lncurses 头文件:#include<curses.h> 参考:man ncurses \linu ...

  4. 踩坑事件:不能对基于文本的临时表使用sql insert语句

    先来描述一下问题: 如果你是从基于文本的数据源来创建DataFrame的,当你将DataFrame注册为临时表后,如果对这个临时表进行insert into 操作,会抛出异常的. 问题答案参见:htt ...

  5. Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞

    漏洞名称: Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-067 发布时间: 2013-11-07 ...

  6. 基于文本图形(ncurses)的文本搜索工具 ncgrep

    背景 作为一个VIM党,日常工作开发中,会经常利用grep进行关键词搜索,以快速定位到文件.如图: 利用grep进行文本搜索 但是,这一过程会有两个效率问题: 展示的结果无法进行直接交互,需要手动粘贴 ...

  7. Android的so注入( inject)和函数Hook(基于got表) - 支持arm和x86

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53942648 前面深入学习了古河的Libinject注入Android进程,下面来 ...

  8. SetConsoleTextAttribute 函数--设置控制台文本属性

    SetConsoleTextAttribute函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs. ...

  9. poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)

    http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它主要的性质. 1.欧拉函数是求小于n且和n互质(包含1)的正整数的个数. 记为φ(n). 2. ...

随机推荐

  1. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  2. linux中模糊查找文件

    1.在当前目录下搜索指定文件: find . -name test.txt 2.在当前目录下模糊搜索文件: find . -name '*.txt' 3.在当前目录下搜索特定属性的文件: find . ...

  3. strstr()函数的使用

    strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. 实例: /** *Descriptio ...

  4. 带你玩转Visual Studio——带你了解VC++各种类型的工程

    原文地址:http://blog.csdn.net/luoweifu/article/details/48816605 上一篇文章带你玩转Visual Studio——带你新建一个工程一文中提到新建一 ...

  5. [加密算法]为什么说RSA难以被破解

    RSA算法运用了数学“两个大的质数相乘,难以在短时间内将其因式分解”的这么一套看似简单事实上真的是很困难的一个数学难题...... 以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我 ...

  6. Java插入排序算法

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  7. nikto for windows(web扫描工具) 使用教程

    本文出处: 欧普软件 ----------------------------------------------------------------------------------------- ...

  8. Confluence 6 数据库整合的方法 1:基本流程

    步骤 1:对你的插件进行记录 对你近期在 Confluence 中安装和启用的插件进行记录,这你可以在后期对插件进行重新安装或者调整.针对你安装的插件,你需要记录下面的一些内容: 插件名称 版本号 启 ...

  9. Confluence 6 关于 Decorators

    Confluence 是使用开源的 SiteMesh 库构建的.一个 Web 页面的布局系统,这个布局系统能够在全站点中提供完整统一的界面和外观.SiteMesh 是通过 "decorato ...

  10. Swift Write to file 到电脑桌面

    (arr as NSArray).write(toFile: "Users/你的用户名/Desktop/mian.plist", atomically: true)