linux下curses库介绍

linux下curses库介绍相信您在网路上一定用过如 tin elm 等工具 这些软体有项共同的特色 即他们能利用上下左右等方向键来控制游标的位置 除此之外 这些程式的画面也较为美观 对 Programming 有兴趣的朋友一定对此感到好奇 也许他能在 PC 上用 TurboC 轻易地写出类似的程式 然而 但当他将相同的程式一字不变地移到工作站上来编译时 却出现一堆抓也抓不完的错误 其实 原因很简单 他

相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式的画面也较为美观. 对Programming 有兴趣的朋友一定对此感到好奇, 也许他能在 PC上用Turbo C轻易地写出类似的程式, 然而, 但当他将相同的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误. 其实, 原因很简单, 他使用的函式库可能在 UNIX 上是没有定义的. 有些在 Turbo-C 上被广泛使用的一些函式, 可能在 UNIX 上是不被定义的. 为了因应网路上各式各样的终端机形态 (terminal), UNIX 上特别发展出一套函式库, 专门用来处理 UNIX 上游标移动及萤幕的显示. 这就是本篇文章要为您介绍的 – curses.h 函式库. 利用这个函式库, 您也可以写出像 elm 般利用方向键来移动光棒位置的程式.

 

 

1. curses 的历史与版本:

    cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计的. 因此, 利用 curses 发展出来的程式将和您所使用的终端机无关. 也就是说, 您不必担心您的程式因为换了一部终端机而无法使用. 这对程式设计师而言, 尤其是网路上程式的撰写, 是件相当重要的一件事. curses之所以能对上百种以上的终端机工作, 是因为它将所有终端机的资料, 存放在一个叫 termcap 的资料库, ( 而在第二版的 System V 系统中, 新版的 curses 以 terminfo 取代原来的 termcap).

    有了这些记录, 程式就能够知道遇到哪一种终端机时, 须送什麽字元才能移动游标的位置, 送什麽字元才能清除整个萤幕清除. (* 注一)

另外, 本文的介绍 以 System V 的 curses 版本为主.

 

2. 如何在您的程式使用 curses:

在您的 C 程式的档头将 <cureses.h>include 进来.当您引进 curses.h 这个函式库後, 系统会自动将 <stdio.h>和 <unctl.h>一并 include 进来.

另外, 在 System V 版本中, <terminfo.h>这个函式库也将一并include进来.

#include <curses.h>

main()

{

: :

: :

}

 

3. 如何编译(compile):

当您编辑好您的程式, 在 UNIX 提示符号下键入:

gcc [file.c] -lcurses

gcc [file.c] -lcurses -ltermlib(*注二)

 

4. 如何开始我的第一个 curses 程式:

在开始使用 curses 的一切命令之前, 您必须先利用 initscr()这个函式来开启 curses 模式.

相对的, 在结束 curses 模式前 ( 通常在您结束程式前 ) 也必须以endwin()来关闭 curses 模式.

linux下curses库介绍 #include  < curses.h >
linux下curses库介绍
linux下curses库介绍main()
linux下curses库介绍


{

linux下curses库介绍    initscr();
linux下curses库介绍    : :
linux下curses库介绍    : : 
linux下curses库介绍    : :
linux下curses库介绍    endwin();
linux下curses库介绍}





 
linux下curses库介绍
linux下curses库介绍

这是一般 curses 程式标准的模式.

此外, 您可以就您程式所须, 而做不同的设定. 当然, 您可以不做设定,而只是呼叫 initscr(). 您可以自己写一个函式来存放所有您所须要的设定. 平常使用时, 只要呼叫这个函式即可启动 curses 并完成一切设定. 下面的例子, 即是笔者将平常较常用的一些设定放在一个叫 initial()的函式内.

linux下curses库介绍 void  initial()
linux下curses库介绍
{

linux下curses库介绍    initscr();
linux下curses库介绍    cbreak();
linux下curses库介绍    nonl();
linux下curses库介绍    noecho();
linux下curses库介绍    intrflush(stdscr,FALSE);
linux下curses库介绍    keypad(stdscr,TRUE);
linux下curses库介绍    refresh();
linux下curses库介绍}








linux下curses库介绍
linux下curses库介绍

 各函式分别介绍如下:

  • initscr(): initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式.
  • endwin(): curses 通常以呼叫 endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离 curses 模式. 如果您在程式中须要call shell ( 如呼叫 system() 函式 ) 或是需要做 system call, 就必须先以 endwin() 暂时跳离 curses 模式. 最後再以wrefresh() doupdate() 来重返 curses 模式.
  • cbreak() and nocbreak(): 当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来取代 cbreak(),nocbreak() 
  • nl() and nonl(): 用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字元 ( 如 /n ). 而输出资料时, NEWLINE 字元是否被对应为 RETURN 和 LINDFEED系统预设是开启的.
  • echo() and noecho(): 此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统预设是开启的.
  • intrflush(win,bf): 呼叫 intrflush 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应将较为快速.但可能会造成萤幕的错乱. 
  • keypad(win,bf): 呼叫 keypad 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当开启 keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右>等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键. 这些定义的特殊键通常以 KEY_ 开头.
  • refresh(): refresh() 为 curses 最常呼叫的一个函式. curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤幕的工作. 

 

5. 游标的控制:

  • move(y,x): 将游标移动至 x,y 的位置.
  • getyx(win,y,x): 得到目前游标的位置. (请注意! 是 y,x 而不是&y,&x )

 

6. 有关清除萤幕的函式:

clear() and erase(): 将整个萤幕清除. (请注意配合refresh() 使用)

 

7. 如何在萤幕上显示字元:

  • echochar(ch): 显示某个字元.
  • addch(ch): 显示某个字元.
  • mvaddch(y,x,ch): 在(x,y) 上显示某个字元. 相当於呼叫move(y,x);addch(ch);
  • addstr(str): 显示一串字串.
  • mvaddstr(y,x,str): 在(x,y) 上显示一串字串. 相当於呼叫move(y,x);addstr(str);
  • printw(format,str): 类似 printf() , 以一定的格式输出至萤幕.
  • mvprintw(y,x,format,str): 在(x,y) 位置上做 printw 的工作. 相当於呼叫move(y,x);printw(format,str);

 

8. 如何从键盘上读取字元:

  • getch(): 从键盘读取一个字元. (注意! 传回的是整数值)
  • getstr(): 从键盘读取一串字元.
  • scanw(format,&arg1,&arg2…): 如同 scanf, 从键盘读取一串字元.

例:

linux下curses库介绍 int  ch;
linux下curses库介绍
char  string1[ 80 ];  /* 请注意! 不可宣告为 char *string1; */
linux下curses库介绍
char  string2[ 80 ];
linux下curses库介绍echo(); 
/* 开启 echo 模式, 使输入立刻显示在萤幕上 */
linux下curses库介绍ch
= getch();
linux下curses库介绍string1
= getstr();
linux下curses库介绍scanw(
%s ,string2);
linux下curses库介绍mvprintw(
10 , 10 , String1=%s ,string1);
linux下curses库介绍mvprintw(
11 , 10 , String2=%s ,string2);

 

 9. 如何利用方向键:

    curses 将一些如方向键等特殊控制字元, 以 KEY_ 为开头定义在 curses.h这个档案里头.

    如 KEY_UP 即代表方向键的 ” ↑ “. 但, 如果您想使用curses.h 所为您定义的这些特殊键的话, 您就必须将 keypad 设定为TRUE. 否则, 您就必须自己为所有的特殊键定义了. curses.h 为一些特殊键的定义如下:

  • KEY_UP 0403 ↑
  • KEY_DOWN 0402 ↓
  • KEY_LEFT 0404 ←
  • KEY_RIGHT 0405 →
  • KEY_HOME 0406 Home key (upward+left arrow)
  • KEY_BACKSPACE 0407 backspace (unreliable)
  • KEY_F0 0410 Function keys.
  • KEY_F(n) (KEY_F0+(n)) formula for f .
  • KEY_NPAGE 0522 Next page
  • KEY_PPAGE 0523 Previous page

以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参阅 man curses (* 注三).

一并为您列出其他常用的一些特殊字元:

  • [TAB] /t
  • [ENTER] /r
  • [ESC] 27
  • [BACKSPACE] 127

  

10. 如何改变萤幕显示字元的属性:

    为了使输出的萤幕画面更为生动美丽, 我们常须要在萤幕上做一些如反白, 闪烁等变化. curses 定义了一些特殊的属性, 透过这些定义, 我们也可以在 curses 程式控制萤幕的输出变化.

  • attron(mod): 开启属性.
  • attroff(mod): 关闭属性.

curses.h 里头定义了一些属性, 如:

  • A_UNDERLINE: 加底线.
  • A_REVERSE: 反白.
  • A_BLINK: 闪烁.
  • A_BOLD: 高亮度.
  • A_NORMAL: 标准模式(只能配合 attrset() 使用)

    当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以该种属性出现. 直到您呼叫 attroff() 将此模式关闭. 请注意, 当您欲 attron() 开启另一种属性时, 请记得利用attroff()先关闭原来的属性, 或直接以attrset(A_NORMAL) 将所有特殊属性关闭.否则, curses 会将两种属性做重叠处理.

例:

attrset(A_NORMAL); /* 先将属性设定为正常模式 */

attron(A_UNDERLINE); /* 加底线 */

mvaddstr(9,10,”加底线”); /* 加底线输出一串字元 */

attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式 */

attron(A_REVERSE); /* 开启反白模式 */

mvaddstr(10,10,”反白”); /* 输出一串反白字元 */

attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式 */

attron(A_BLINK); /* 开启闪烁模式 */

mvaddstr(11,10,”闪烁”); /* 输出一串闪烁字元 */

attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式 */

attron(A_BOLD); /* 开启高亮度模式 */

mvaddstr(12,10,”高亮度”); /* 输出一串高亮度字元 */

attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式 */

 

11. 其他一些函数:

  • beep(): 发出一声哔声.
  • box(win,ch1,ch2): 自动画方框.
    • ch1: 画方框时垂直方向所用字元.
    • ch2: 画方框时水平方向所用字元.
    • example: box(stdscr,’|’,’-‘); 将以 | 及 – 围成一个方框.

  

12. 应用完整例:

    下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程式可将从键盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置, 当按下 [ESC] 後, 程式即结束. 您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗?

实例1:

 

实例2:

#include <curses.h>

curses库函数说明  



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231363.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月15日 下午6:01
下一篇 2026年1月15日 下午6:22


相关推荐

  • c++ auto类型_auto C++

    c++ auto类型_auto C++编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如int)不同。auto让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说auto定义的变量必须有初始值。有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式

    2025年10月14日
    4
  • 希腊字母表及其读音与意义

    希腊字母表及其读音与意义转载自 http www cnblogs com lookof articles 1291076 html 最近由于备研的关系 重温了当时令人头疼的数学 当中看到了不少希腊字母 什么 阿尔法 了 贝塔 了等等 发音不少都忘记了 可想背公式时如鲠在喉的滋味 特在网上搜集一篇这样的专文 收藏之以备不时之需 希腊字母在现代已经超越了希腊民族的局限而成为了国际性的符号 自然科学的 社会科

    2026年3月19日
    2
  • SPSS 方差分析

    SPSS 方差分析统计学上的因素是指研究者关心的实验条件 而水平是指因素的具体表现形式 6 1 单因素方差分析 6 1 1 原理单因素方差分析仅研究了单个研究因素 该因素有多个水平 3 如果为 2 个水平就用 T 检验了 方差分析就是通过分析处理组均数之间的差别 推断试验所代表的多个总体均数间是否存在差别 其原理是将全部观察数据的变异 总变异 分解为组间变异和组内变异 如果组间的变异远远大于组内变异 则有理由认为本次研究的因素发挥着作用 1 总变异 每个实验对象数据与总体均数的差异 2 组间变异 各处理

    2026年3月26日
    2
  • mybatiscodehelperpro使用_ok卡过期了在哪里激活

    mybatiscodehelperpro使用_ok卡过期了在哪里激活插件下载地址https://download.csdn.net/download/printf88/16301731下载完成后解压在IDEA中本地安装插件File>Settings>Plugins找到刚才的解压文件选择你需要的版本压缩包点击确定重启Idea激活方法激活方法(自2.7.3):IDEA顶部菜单:Tools->MybatisCodeHelper->Activation->OfflineActivat…

    2026年2月12日
    3
  • 设备驱动基础学习–platform driver简单实现「建议收藏」

    设备驱动基础学习–platform driver简单实现「建议收藏」设备驱动基础学习–platformdriver简单实现

    2022年7月4日
    24
  • ArcGIS二次开发入门 一

    ArcGIS二次开发入门 一ArcGIS二次开发入门一

    2022年6月24日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号