使用 curses 函数库管理基于文本的屏幕

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 子系统和相关数据结构占用的内存。

时间: 2024-10-22 14:06:01

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

基于文本分析的参数估计

目录 0基于文本分析的参数估计... 1 1     参数估计方法... 1 1.1最大似然估计MLE. 2 1.2最大后验概率... 3 1.3贝叶斯推理... 4 2     共轭分布... 7 2.1 随机生成过程及共轭分布... 7 2.2 Multinomial分布和 Dirichlet分布... 8 3 unigram model10 3 LDA隐含狄利克雷分布... 11 3.1   Gibbs Sampling的流程... 13 3.2   LDA的联合分布... 14 3.3

linux curses函数库

fedora20,安装yum install ncurses-devel 编译时:-lncurses 头文件:#include<curses.h> 参考:man ncurses \linux程序设计 一,屏幕 1, 以initscr()开始,以endwin();结束 WINDOW *initscr(void); //初始化 int endwin(void); // 退出curses, 返回OK/ERR 2, 输出到屏幕 int addch(const chtype ch); //当前位置add

基于文本内容的压缩

数据压缩 减少不必要的资源加载之后,我们将剩下的资源进行压缩. 为了解释数据压缩的原则,我们创建一个txt文本,内容如下: # Below is a secret message, which consists of a set of headers in # key-value format followed by a newline and the encrypted message. format: secret-cipher date: 04/04/14 AAAZZBBBBEEEMMM

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

作为一个VIM党,日常工作开发中,会经常利用grep进行关键词搜索,以快速定位到文件.如图: 利用grep进行文本搜索 但是,这一过程会有两个效率问题: 展示的结果无法进行直接交互,需要手动粘贴文件路径在打开 展示的结果没有进行分组,直接将结果罗列出来 可想而知,当搜索的内容结果集比较大时,可谓痛苦. 那可以用Vim中的Ag插件进行搜索啊? 是的,但他只解决了交互的问题.仍然没有解决结果集分组分类的痛点. 在vim下利用ag进行文本搜索 思路 在使用Eclipse等IDE进行文本全局搜索时,在加

常用GDI函数(2):绘制文本

1.TextOut()和DrawText()函数 CDC::TextOut()使用当前字体在窗口的指定位置处输出文本,函数声明: virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount); BOOL TextOut(int x, int y, const CString& str); CPaintDC dc(this); dc.TextOut(0, 100, _T("hello word"), 5);

基于文本密度的新闻正文抽取方法之Python实现

参考文章链接: http://www.cnblogs.com/jasondan/p/3497757.html http://d.wanfangdata.com.cn/Patent/CN201410007832.6/ 基于网页分析构思出的正文提取算法 回顾以上的网页分析,如果按照文本密度来找提取正文,那么就是写这么一个算法,能够从过滤html标签后的文本中找到正文文本的起止行号,行号之间的文本就是网页正文部分. 还是从上面三个网页的分析结果看,他们都有这么一个特性:正文部分的文本密度要高出非正文部

【NLP】Python实例:基于文本相似度对申报项目进行查重设计

Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起到一定纠正作用.单位主要针对科技项目申报审核,传统的方式人力物力比较大,且伴随季度性的繁重工作,效率不高.基于此,单位觉得开发一款可以达到实用的智能查重系统.遍及网络文献,终未得到有价值的参考资料,这个也是自然.首先类似知网,paperpass这样的商业公司其毕业申报专利并进行保密,其他科研单位因发

37 py为什么要使用函数函数中添加文本注释 没有返回值的函数

第一课:为什么要使用函数 首先 要知道 本课程的主要讲解的内容为: 1.为什么要创建函数 2.***函数的概念是:将一段可能别重用的代码封账到一个代码段里面,然后通过函数的参数 ,控制函数的动态部分.// 如何来定义python中的函数和使用函数 *** 3.如何创建一个函数 4.如何为函数添加文档注释,如何获取函数的文档注释 5.函数如何返回一个值 6.改变函数的参数值 7.关键字参数与参数默认值 8.可变参数 9.如何将序列中的元素单独作为参数值传递给函数 10.函数中的作用域 11.递归函

C语言之贪吃蛇(curses库函数)

上大学学习编程的初始目的就是冲着游戏来的~不过在刚学习C语言的时候,完全无法利用所学知识弄出一个可玩的游戏╮(╯_╰)╭,学了1年后仍然对最简单的贪吃蛇没有思路(当然不是说没有打代码的思路,而是没有办法弄出动态的东西,而且当时往算法那走了~),直到如今大二,利用寒假的一点时间入门Linux的时候,发现了curses库函数!当我看明白它的作用时,拍案而起,TM这玩意不就是我梦寐以求的可实现界面的东东么!当我学了一点点就觉悟到,用一个move()和printw()函数就完全可以把贪吃蛇这种级别的写出