【问题标题】:How do I flush the cin buffer?如何刷新 cin 缓冲区?
【发布时间】:2010-09-20 09:39:32
【问题描述】:

如何在 C++ 中清除 cin 缓冲区?

【问题讨论】:

    标签: c++ cin io-buffering


    【解决方案1】:

    与 C 版本相比,我更喜欢 C++ 大小限制:

    // Ignore to the end of file
    std::cin.ignore(std::numeric_limits<std::streamsize>::max())
    
    // Ignore to the end of line
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
    

    【讨论】:

    • 更重要的是,值可能不同! (streamsize 不必是 int)
    • 能否请您举一个我们需要忽略到文件末尾的示例,因为如果我使用cin 并使用上面的第一条语句刷新cin 缓冲区,那么它会一直提示输入直到我按ctrl+d输入EOF
    • @ajay:不。这是你需要决定的事情。我只是在解释上面的内容。
    【解决方案2】:

    可能:

    std::cin.ignore(INT_MAX);
    

    这将读入并忽略所有内容,直到EOF。 (您还可以提供第二个参数,它是要读取的字符(例如:'\n' 忽略一行)。

    另外:您可能还想在此之前执行:std::cin.clear(); 以重置流状态。

    【讨论】:

    • 清除之前而不是之后,因此流被置于可以对其缓冲区进行操作的良好状态。
    • 只是想指出,对于我的情况,我认为 '\n' 是必要的。否则后面的“cin >>”不起作用。
    • 对我来说,这会停止,直到找到至少与参数一样多的字符(微软编译器)
    • @Nic - 当然,这告诉代码忽略所有字符,直到指定的数量。在主要示例中,它将基本上忽略直到EOF(因为INT_MAX 很大)。如帖子中所述,如果您只想忽略一行,则需要指定一个额外的参数'\n 来告诉它您只想忽略到该行的末尾。
    • 如果你在下次调用 getline(cin, input) 时这样做,你可以按一个字符然后输入一整天,它不会通过。
    【解决方案3】:
    cin.clear();
    fflush(stdin);
    

    这是从控制台读取时唯一对我有用的东西。在其他所有情况下,它要么会因为缺少 \n 而无限期地读取,要么会保留在缓冲区中。

    编辑: 我发现以前的解决方案使事情变得更糟。然而,这个有效:

    cin.getline(temp, STRLEN);
    if (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    

    【讨论】:

    • 是的,不要在标准输入 上使用 fflush(或任何为此打开读取的流),这是未定义的行为
    【解决方案4】:

    我找到了两种解决方案。

    第一个也是最简单的,例如使用std::getline()

    std::getline(std::cin, yourString);
    

    ...当输入流到达换行符时将丢弃它。阅读有关此功能的更多信息here

    另一个直接丢弃流的选项是这个...

    #include <limits>
    // Possibly some other code here
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    祝你好运!

    【讨论】:

      【解决方案5】:
      int i;
        cout << "Please enter an integer value: ";
      
        // cin >> i; leaves '\n' among possible other junk in the buffer. 
        // '\n' also happens to be the default delim character for getline() below.
        cin >> i; 
        if (cin.fail()) 
        {
          cout << "\ncin failed - substituting: i=1;\n\n";
          i = 1;
        }
        cin.clear(); cin.ignore(INT_MAX,'\n'); 
      
        cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
      
        string myString;
        cout << "What's your full name? (spaces inclded) \n";
        getline (cin, myString);
        cout << "\nHello '" << myString << "'.\n\n\n";
      

      【讨论】:

        【解决方案6】:

        怎么样:

        cin.ignore(cin.rdbuf()->in_avail());
        

        【讨论】:

        【解决方案7】:

        我更喜欢:

        cin.clear();
        fflush(stdin);
        

        有一个例子 cin.ignore 只是没有削减它,但我现在想不起来。不久前我需要使用它(与 Mingw 一起)。

        但是,根据标准,fflush(stdin) 是未定义的行为。 fflush() 仅用于输出流。 fflush(stdin) 似乎只能在 Windows 上按预期工作(至少使用 GCC 和 MS 编译器)as an extension to the C standard

        因此,如果您使用它,您的代码将无法移植。

        Using fflush(stdin)

        另外,请参阅http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 了解替代方案。

        【讨论】:

        • fflush(stdin);是未定义的行为(在 C 编程语言中),在 7.18.5.2/2 中明确说明
        • +1 用于提供有效的、有效的组合。有些人有工作,有些人有标准。
        • @Mikhail:你的工作应该包括编写符合标准的代码。我将确保避免使用您将来编写的任何内容。
        【解决方案8】:

        另一种可能的(手动)解决方案是

        cin.clear();
        while (cin.get() != '\n') 
        {
            continue;
        }
        

        我不能将 fflush 或 cin.flush() 与 CLion 一起使用,所以这很方便。

        【讨论】:

        • 我的无限循环。
        • 只有行尾才有效,否则无限循环
        【解决方案9】:

        最简单的方法:

        cin.seekg(0,ios::end);
        cin.clear();
        

        它只是将 cin 指针定位在标准输入流的末尾,而 cin.clear() 清除所有错误标志,例如 EOF 标志。

        【讨论】:

          【解决方案10】:

          它对我有用。我已经使用 getline() 的 for 循环。

          cin.ignore()
          

          【讨论】:

            【解决方案11】:

            以下应该有效:

            cin.flush();
            

            在某些系统上它不可用,然后您可以使用:

            cin.ignore(INT_MAX);
            

            【讨论】:

            • 当你可以告诉忽略读取的 INT_MAX 字符直到它达到 EOF(第二个参数的默认值)时,为什么要手动编写一个循环。
            • Gunnar,最好编辑您的帖子以反映这一点,以防万一。
            • 据我所知,flush 方法仅用于输出,处理已写入的字符。
            • cin.flush(): basic_istream&lt;char&gt;' has no member named 'flush'
            【解决方案12】:
            #include <stdio_ext.h>
            

            然后使用函数

            __fpurge(stdin)
            

            【讨论】:

              【解决方案13】:

              cin.get() 似乎很奇怪地自动刷新它(但可能不是首选,因为这令人困惑并且可能是喜怒无常的)。

              【讨论】:

                猜你喜欢
                • 2020-12-12
                • 1970-01-01
                • 2015-08-10
                • 2021-09-03
                • 1970-01-01
                • 2018-07-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多