CIN函数不显示本地回声

cin function doesn't show local echo

本文关键字:回声 显示 函数 CIN      更新时间:2023-10-16

我有一个程序,用I=getchar()扫描用户输入并且有效。为了防止用户每次使用时都必须按Enter键:

    tcgetattr(STDIN_FILENO,&old_tio);
    new_tio=old_tio;
    new_tio.c_lflag &=(~ICANON & ~ECHO);
    tcsetattr(STDIN_FILENO,TCSANOW,&new_tio);

我用重置

    tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);

之后,用户必须键入一些内容。我用了这个:

string userinput;
cin >> userinput;

但是控制台不显示键入的文本(在键入时)。我尝试手动重新启用本地回声:

tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
old_tio.c_lflag |= ECHO;

但是控制台仍然没有显示本地回声现在是晚上10点,我很困,所以我的问题可能很容易回答

您对set的调用是在更改属性之前调用的:

tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
old_tio.c_lflag |= ECHO;

切换顺序,它应该会起作用。

该代码适用于我(见下文)。值得验证的是,所有系统调用实际上都是成功的。此外,您没有显示整个代码:我可以想象,还没有切换到恢复的输入模式。由于我无法重现这个问题,我无法评论为什么它不起作用。

这是我用来测试的代码:

#include <termios.h>
#include <iostream>
#include <string>
int main()
{
    termios old_tio, new_tio;
    int rc = tcgetattr(0,&old_tio);
    std::cout << "rc1=" << rc << 'n';
    new_tio=old_tio;
    new_tio.c_lflag &=(~ICANON & ~ECHO);
    rc = tcsetattr(0,TCSANOW,&new_tio);
    std::cout << "rc2=" << rc << 'n';
    std::string value;
    if (std::cin >> value) {
        std::cout << "value='" << value << "'n";
    }
    rc = tcsetattr(0,TCSANOW,&old_tio);
    std::cout << "rc3=" << rc << 'n' << std::flush;
    if (std::cin >> value) {
        std::cout << "value='" << value << "'n";
    }
}