用C ++清除键盘缓冲区

时间:2012-12-21 08:41:54

标签: c++

我的应用程序的一部分我使用Sleep(5000)(我需要等待5秒)

问题是如果用户在这5秒钟内按下任何键盘键,睡眠后会读取键,这会导致我的应用程序出现问题。

如何在睡眠后清空缓冲区?

我尝试了cin.clear()setbuf(stdin, NULL),但如果缓冲区中有多个字符,则无法清除缓冲区。

3 个答案:

答案 0 :(得分:6)

您正在使用的两个功能没有您期望的效果:

  1. clear()根本不会影响缓冲区,而是清除错误标记。也就是说,如果读取不成功,则设置标志(std::ios_base::failbit)。虽然设置了任何错误标志(还有一些),但流不会尝试读取任何内容。
  2. setbuf(0, 0)会影响流的内部缓冲区不存在(具有非空值的调用具有实现定义的含义,通常是“什么都不做”)。这通常是一个坏主意,因为它会导致流非常慢。此外,用户按下的键可能不会存储在此缓冲区中,而是存储在操作系统输入缓冲区中,直到它们被发送到应用程序(有平台特定方式关闭操作系统输入缓冲区,例如,在POSIX上'使用tcsetattr()将输入设置为非规范模式。
  3. 在任何一种情况下,没有缓冲区并不能真正帮助你:用户可能已经输入了有效的输入。正确的方法是尝试读取可用的输入,如果失败,则去除违规的字符(或字符)。为此,您将尝试读取输入,如果失败,则您clear()流和ignore()一个或多个字符(此示例忽略整行;请在没有ignore()的情况下调用T value; while (!(std::cin >> value)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } 参数只是忽略一个字符):

    {{1}}

    您始终需要验证输入是否成功,而额外的几行只是添加了一些恢复代码。

答案 1 :(得分:0)

清除键盘输入缓冲区的最简单方法是

String joined = String.join(" ", yourStringArray);

只需将代码放在您想要清除缓冲区的程序中。

所需的头文件是 conio.h

答案 2 :(得分:0)

这似乎适用于使用Code :: Blocks编译的Windows 10:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

namespace MyFirstAutoScript
{
    class Program
    {
        static void Main(string[] args)
        {
            IWebDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("https://yelitzascareerjourney.wordpress.com/");
            driver.FindElement(By.LinkText("My Resume")).Click(); //my page brakes here
            more commands go here...
        }
    }
}

然后在C ++脚本中需要调用。