efo() : 如果达到文件 (或输入) 的末尾,返回 true 。
faile() : 如果 cin 无法工作,返回 true 。
bad() : 如果 cin 因为比较严重的原因 (比如内存不足) 而无法工作,返回 true 。
good() : 如果以上情况都没发生,返回 true 。
比如:
[C++] 纯文本查看 复制代码
int year;
std::cout << "Enter a year: ";
if (std::cin.good())
std::cout << "you enter " << year << '\n';
else
std::cout << "Wrong input" << '\n';
这样当 cin 接收到字符输入时就会提示出错。不然在默认情况下,cin 会将字符输入也赋值到整数中,从而会造成计算错误。
上面的 if (std::cin.good()) 也可以简写成 if(std::cin >> year) 。
如果 cin.fail() 或 cin.bad() 调用的返回值为 true ,那么就说明有问题发生。这类问题的基本处理步骤是:先用 clear() 函数清除 cin 的出错状态(clear() 只能清除出错状态,而不清理输入缓冲区),然后再用 ignore() 函数将输入缓冲区里的现有输入全部丢弃,比如:
[C++] 纯文本查看 复制代码 while (!(std::cin >> year)) {
std::cin.clear();
std::cin.ignore(100, '\n');
std::cout << "must be integer, reinput" << '\n';
std::cout << "Enter a year: ";
}
如果上面不用 clean() 函数清除错误状态,那么 while() 的判断里就会一直认为 std::cin >> year 这个表达式已经有了返回,而且返回的状态就是前一次的输入状态,这样就会造成无限循环输出 while() 循环体里的内容。 |