不回车获得一个字符(UNIX和LINUX C++)

在UNIX系统中,通常整行输入才被处理,但某些程序需要逐个字符读取。文章介绍了两种方法实现逐字符输入:1) 使用`stty raw`命令切换终端模式,然后用`getchar()`读取;2) 通过`ioctl()`系统调用来实现非阻塞读取,检查是否有字符等待读取。最后强调了在程序结束后需要恢复终端模式以避免影响后续使用。
摘要由CSDN通过智能技术生成

MS-DOS程序员在转到UNIX系统之后最先提出的问题之一就是“我如何在不按一下回车键的情况下从终端读取一个字符?”在UNIX中,终端输入 在缺省情况下是被“一锅端”的,也就是说整行输入是被一起处理的,这样行编辑字符(backspace , delete等)可以不通过正在运行的程序就能发挥作用。通常,这是一种人们希望的方便方法,但它也意味着在读入数据时必须按一下回车键表示输入行结束后 才能得到输入的数据。这种方法对于整行整行的输入是非常有效的,但有些程序需要在每按一键之后就得到这个字符,这就有些不方便了。这个“一次输入一个字符的”特性对于许多种类的软件来说都是非常重要的,但对于PC而言却是小菜一碟。C函数库支持这个特性,通常使用一个kbhit() 的函数,如果一个字符正在等待被读取,它就会发出提示。Microsoft ,Borland 的C编译器提供了了getch()(或getche(),它可以使字符在读取的同时回显在屏幕上来)来获取单个字符,而不用等整行结束。人们经常感到疑惑,为什么ANSI C 不定义一个标准的函数来获取一次按键后的字符。由于没有一种标准的方法,每个系统都采用了不同的方法,这们样便使程序失去了可移植性。反对将kbhit ()纳入标准的人认为:它在绝大多数情况下用于游戏软件的,而且还存在其他许多未标准化的终端I/O特性。另外,你可能并不想要一个在某些操作系统中很难 实现的标准库函数。赞成它的人则认为:它在绝大多数情况下用于游戏软件,而游戏编写者并不需要很多的标准化的其它终端I/O特性。不论你支持哪个观点,事 实上X3J11小组还是错过了一个使C语言成为一代学生程序员在UNIX上编写游戏的一种选择的机会(就是未吸纳这个特性)。在UNIX中,有两种方法可 以实现逐个字符的输入,一种很难,一种很容易。容易的方法就是让stty程序来实现这个功能。尽管它是一种间接实现的方法,但对程序而言并无大碍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值