有没有办法在看到换行符之前处理命令行输入?我正在考虑制作一个支持自动完成功能的程序(例如在搜索引擎或iOS键盘中找到的程序)。
更具体地说,我的程序将在启动时提示用户输入,并且对于每个字符输入,我想输出 之前 换行符(或EOF)输入。
以下是我尝试过的代码段:
int main(){
char ch;
while ( (ch = cin.get()) != cin.eof() )
{
cout << ch << flush;
}
}
预期:对于每个字符输入,输出该字符。
实际:在程序看到eof之前不会输出任何内容。
答案 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;
}