【问题标题】:Problems with std::cin.fail()std::cin.fail() 的问题
【发布时间】:2026-01-13 10:50:01
【问题描述】:

我正在编写一些代码以使用 cpp 从终端读取,但由于某种原因,它在用完数字后崩溃了。根据我在网上阅读的内容,我应该能够通过使用 std::cin.fail() 来检查 std::cin 是否成功,但之前它会崩溃。

我运行的代码是

#include <iostream>

int main()
{
    int x{};

    while (true)
    {
        std::cin >> x;
        if (!std::cin)
        {
            std::cout << "breaking" << '\n';
            break;
        }
        std::cout << x << '\n';
    }
    return 0;
}

输入:

test@test:~/learn_cpp/ex05$ ./test
1 2
1
2
^C

我最终不得不 ctrl+c 退出程序。版本信息:

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

【问题讨论】:

  • 该循环的更简单版本是while (std::cin &gt;&gt; x) std::cout &lt;&lt; x &lt;&lt; '\n';

标签: c++ iostream cin


【解决方案1】:

您输入中的任何内容都不会导致cin 设置失败位。因此,while (true) 将继续运行。您可以输入一个字母,或者其他不是int 的内容,这将设置失败位,并导致循环中断。

请注意,为此将忽略新行。

如果您知道您的所有输入将在一行中,那么您可以使用std::getline 读取整行,然后使用std::stringstream 从该行读取整数。

#include <iostream>
#include <sstream>
#include <string>

int main() {
    int x{};
    std::string buff;
    std::getline( std::cin, buff );
    std::stringstream ss( buff );
    while ( ss >> x ) {
        std::cout << x << '\n';
    }

    return 0;
}

【讨论】:

  • 无内容可读时是否抛出cin异常?
  • 不,总有一些东西要读,除非你点击 eof;在命令行中,它类似于 ctrl D,总是忘记它到底是什么。
  • 那么,如果最终用户输入的值不确定,如何解决这个问题呢?是否可以读取 eof 的结尾并有条件地退出?
  • 您可以使用std::getline 读取整行,将结果传递给std::stringstream 并使用它来获取整数。
  • @MortenNissov,我添加了一个示例。