发信人: 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]
|
|