【问题标题】:cin function doesn't show local echocin 函数不显示本地回声
【发布时间】:2013-11-27 21:33:34
【问题描述】:

我有一个使用 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 点,我很困,所以我的问题可能很容易回答

【问题讨论】:

  • 你确定你最后两行的顺序没有错吗?
  • 奇怪。 old_io 确实应该包含 echo 标志,因此您的第一次重置尝试应该很好。您是否尝试过检查 new_ 和 old_ 变量中存储了哪些标志?
  • @woolstar 谢谢!他们的顺序错误..我是如何监督的..请写一个答案,这样我就可以投票,每个人都可以从中受益。大多数人不阅读 cmets

标签: c++ input console cin


【解决方案1】:

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

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

切换顺序,它应该可以工作。

【讨论】:

    【解决方案2】:

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

    这是我用于测试的代码:

    #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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-01-23
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多