c++ - 为什么我必须在输入的末尾输入一个非整数才能结束程序?

标签 c++ io stdin

#include <iostream>

int main()
{
    int sum = 0, value = 0;

    // read until end-of-file, calculating a running total of all values read
    while (std::cin >> value)
        sum += value; // equivalent to sum = sum + value

    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

这段代码如何知道何时完成获取输入值并显示总和?为什么只有输入非整数值才结束?

最佳答案

std::istream& operator>>(int) 计算结果为 false 时,循环结束。如果流已到达文件末尾或已被标记为错误,则会发生这种情况。输入 float 会导致后者发生。

详细信息:
每个流都包含一个指示流状态的位掩码。掩码中的位包括 eof 位、fail 位和 bad 位(std::ios_base::eofbitstd::ios_base::failbitstd::ios_base::badbit)。第一个相当明显:它是在遇到 EOF 时设置的。接下来的两个有点棘手。 std::ios_base::failbit 当输入操作无法读取期望的字符,或者输出操作无​​法生成期望的字符时设置。 std::ios_base::badbit 在出现严重错误时设置,例如,您的磁盘被炸毁。从流引用到 bool 值的转换最终涉及检查这些位是否未设置。 float 中的小数点会导致失败位被设置,进而导致循环结束。

关于c++ - 为什么我必须在输入的末尾输入一个非整数才能结束程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191056/

相关文章:

c++ - 使用 pthread 在固定数量的线程之间划分工作

c++ - 带初始值设定项的静态数据成员

c++ - 复制时通知对象的实例

io - 在哪里可以在 Colaboratory 上配置 iopub_data_rate_limit?

c - 如何判断 fgets(stdin) 是否会在 Windows 上阻塞?

CoCreateInstance 在控制台应用程序中挂起

python - GNUplot stdin,如何绘制多条线?

c++ - Qt 数据库驱动

java - 使用 java.io 寻找 ByteArrayInputStream

C++ 文件解析器/stdin 输入——这个算法行得通吗?