C ++交互式命令行提示符,无需等待换行符

时间:2019-04-20 00:34:53

标签: c++ c++11

有没有办法在看到换行符之前处理命令行输入?我正在考虑制作一个支持自动完成功能的程序(例如在搜索引擎或iOS键盘中找到的程序)。

更具体地说,我的程序将在启动时提示用户输入,并且对于每个字符输入,我想输出 之前 换行符(或EOF)输入。

以下是我尝试过的代码段:

int main(){
    char ch; 
    while ( (ch = cin.get()) != cin.eof() )
    {       
        cout << ch << flush;
    }   
}

预期:对于每个字符输入,输出该字符。

实际:在程序看到eof之前不会输出任何内容。

1 个答案:

答案 0 :(得分:1)

在类似Unix的系统中,您可以通过将终端更改为非规范输入模式来实现此目的。终端支持规范输入,该输入会收集整行进行编辑,直到按下行末字符或Ctrl-D。结果,应用程序经常在read()系统调用中看到整行。另一方面,非规范输入不进行行缓冲;输入的字符在输入后立即可供程序使用。

这是一个Linux C / C ++示例,说明如何以编程方式设置-icanon标志(非规范)。

#include <iostream>
#include <termios.h>
#include <unistd.h>
int main() {
    struct termios old_tio, new_tio;
    tcgetattr(STDIN_FILENO, &old_tio);
    new_tio = old_tio;
    new_tio.c_lflag &= (~ICANON);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
    char c;
    while (fread(&c, 1, 1, stdin))
        std::cout << c << std::endl;
    return 0;
}