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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tasklist使用详解

    Tasklist使用详解用jstat查看jvm内存的使用的情况时,因为是windows机器,不能使用top命令方便的查出来,进程好在网上搜了一下看到了在windows原来使用的是tasklist特意将tasklist的用法记录下来。原帖的地址是:http://hi.baidu.com/lgh_boffin/blog/item/314b1194fb957c18d21b70b6.html“Tasklist”命令是…

    2022年6月4日
    56
  • 如何进行APP抓包 ? – 学习/实践

    如何进行APP抓包 ? – 学习/实践1.应用场景主要用于对APP进行抓包获取详细的接口信息,这是现在开发必备的。 2.学习/操作 环境: Windows1064位专业版 需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。 工具:Fiddler抓包,夜神模拟器模拟手机安装APP 补充: 可以用手机开一…

    2022年5月30日
    44
  • 自学编程的 6 个致命误区[通俗易懂]

    自学编程的 6 个致命误区[通俗易懂]嗨,小伙伴们大家好,我是沉默王二。本篇文章来和大家聊聊自学编程中的一些误区——这是我在B站上看了羊哥的一期视频后有感而发的文章。因为确实有很多读者也曾私信问过我这些方面的问题,很有代表性,所以我就结合自己的亲身体会来谈一谈,希望对小伙伴们有所启发。01、追求时髦所谓基础不牢,地动山摇啊。可很多小伙伴压根就没注意过这个问题,市面上出什么新鲜的技术就想去尝试,结果把自己学的乱七八糟,心灰意冷…

    2022年5月9日
    45
  • 如何挖矿ETH_以太坊个人挖矿

    如何挖矿ETH_以太坊个人挖矿原文链接:https://zhuanlan.zhihu.com/p/32830672官方钱包以太坊的官方网站是:EthereumProject在网站页面的中间部分,提供了官方钱包的下载链接,网站会自动检测你的操作系统,并提供对应系统下钱包软件的下载链接。不过,官方钱包需要同步区块,既浪费时间,又占用硬盘空间。同时,官方钱包提供了大量其他的功能,比如智能合约。如果只是挖矿的话,这些多余的功能反倒增…

    2022年10月15日
    5
  • TCP与udp区别_个人总结和工作总结的区别

    TCP与udp区别_个人总结和工作总结的区别TCP与UDP区别总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)4、每一条TCP连接只能是点到点的;UDP

    2025年9月19日
    10
  • Thread.IsBackground 属性

    Thread.IsBackground 属性net提供了Thread类用于线程的操作。当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程。后台线程将会随着主线程的推出而退出。后台线程不妨碍程序的终止,只要所有前台线程都终止后,CLR就会对每一个活在的后台线程调用Abort()来彻底终止应用程序。【注意】当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALS…

    2022年8月31日
    4

发表回复

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

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