Unix 和 Linux 环境下如何不按回车读入字符

  2013-05-03 00:00:00 CST

  Jingwen Peng

  C

C/C++,终端下。

在 Windows 中,使用 getchar() 就能实现不按回车读入一个字符。 getchar() 时,命令行提示 Press any key and continue.

但是在 Unix 和 Linux 使用 getchar() 却不能实现。

需要把 I/O 设置为 raw 状态可以实现阻塞式读入 (blocking read),如果终端没有字符输入,进程就一直等待,直到有字符输入为止。如果需要非阻塞式读入,可以使用 ioctl()(I/O 控制) 系统调用。它提供一个针对终端特性的良好控制层,可以告诉你在 SVr4 系统下是否有一个键被按下。下面的代码使用了 ioctl(),这样只有当一个字符等待被读和时进程才进行读取。这种类型的 I/O 被称为轮询,就好像不断地询问设备状态,看看它是否有字符要传给你。

代码看起来就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main(int argc, constchar * argv[]){

    system("stty raw");
    char test;
    std::cin >> test;
    std::cout << test;
    system("stty cooked");

    return 0;
}

最后一行 system(“stty cooked”);是必要的,因为程序结束后,终端字符驱动特性的状态将延续下去。在程序把终端设为一种滑稽的状态之后,如果不作修改,它就会始终处于这种模式。这和设置环境变量明显不同,后者在进程结束后自动消失。

如果您有疑问或建议,请在下方评论区域留言

遵循 BY-NC-ND 协议

评论功能加载中...