精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>资料汇编----------藏经阁>>Unix编程FAQ>>Unix 编程FAQ 第三章1-4节

主题:Unix 编程FAQ 第三章1-4节
发信人: panybin()
整理人: softlag(2000-08-24 02:00:51), 站内信件
3. 终端 I/O
3.1 我怎样使我的程序不提示输入?
    我怎样使我的程序不提示输入,就像login时让你输入密码那样?
处理这个问题,有一个容易的方法,和一个比较难的方法:

容易的方法是使用getpass()函数,这个函数几乎大部分的unix系统都提供. 它给
出一个提示并获得一字串. 然后它读入该字串直到遇到EOF或回车换行后返回一个
指向包含有该输入字串的静态内存块的指针.

较难的方法是使用tcgetattr()和tcsetattr()函数,它们都使用一个termios结构
去管理终端. 下面的两个例程一个用于允许显示输入,一个用于不显示输入.

#include <stdlib.h>
#include <stdio.h>

#include <termios.h>
#include <string.h>

static struct termios stored_settings;

void echo_off(void)
{
    struct termios new_settings;
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;
    new_settings.c_lflag &= (~ECHO);
    tcsetattr(0,TCSANOW,&new_settings);
    return;
}

void echo_on(void)
{
    tcsetattr(0,TCSANOW,&stored_settings);
    return;
}

以上使用的两个例程,均符合POSIX标准.

3.2 我怎样从终端读取一个字符?
    我怎样从终端读取一个字符? 我的程序总是在等待用户去按回车.
终端通常被设为规范方式,输入字符是以行读入的.因此你可以把方式设为非规范
方式,这样你就可以设定在输入字串被给予你的程序时应读入多少字符.当然,你也
可以设定非规范方式终端的计时器为零,这个计时器将按照指定的时间间隔定期的
清除缓冲区.通过这种方法,你就能使用getc()函数去取用户即时按下的键.我们使
用tcgetattr()和tcsetattr()函数来管理termios结构,这两个函数都是标准的PO
SIX函数.

#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <string.h>
static struct termios stored_settings;
void set_keypress(void){
    struct termios new_settings;  
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;

    /* Disable canonical mode, and set buffer size to 1 byte */
    new_settings.c_lflag &= (~ICANON); 
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_cc[VMIN] = 1;   
    tcsetattr(0,TCSANOW,&new_settings);
    return;
}
void reset_keypress(void)
{
    tcsetattr(0,TCSANOW,&stored_settings);
    return;
}

3.3 我怎样检测一个键是否被按下?
    我怎样检测一个键是否被按下?在Dos下我使用kbhit()函数,但是在unix下似
乎没有等同的函数可以调用?
    
如果你把终端设为单字符模式(看前一个回答),在大多数的系统上你能使用selec
t()或poll()函数去检测和读.

3.4 我怎样在屏幕上移动光标?
    我怎样在屏幕上移动光标?我想做全屏编辑但却不想使用Curses库.

严格来说,你不应当这样去做.因为Curses知道怎样处理因不同的终端输入而产生
的各种异常情况;当termcap/terminfo 数据告诉你是否有任何所知的终端类型对
应于这些异常情况的时候,你将发现正确的处理所有这些组合是一个艰巨的工作.


然而,如果你坚持你的意见的话,请仔细的研究termcap函数,尤其是tputs(),tpar
m()和tgoto().

--
一江春水向东流。

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.135.207]

[关闭][返回]