输入流挂起
1. 输入流挂起(Fail State)
当从输入流(如std::cin)读取数据时,可能因以下原因进入错误状态:
- 类型不匹配:例如读取整数时输入了字母(如
"abc")。 - 文件结束(EOF):输入源被关闭(如 Ctrl+D/Linux 或 Ctrl+Z/Windows)。
 - 流缓冲区损坏:例如读取超过最大长度导致溢出。
 
此时,流的状态标志(如failbit或eofbit)会被设置,流进入挂起状态,后续操作会被阻塞。
2. 忽略整行(Clear Invalid Data)
当流挂起时,错误数据会残留在输入缓冲区中。若不清除,后续读取会持续失败。因此需要忽略当前行的所有内容:
// 忽略当前行剩余字符,直到换行符 '\n'
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::numeric_limits<std::streamsize>::max()是最大可忽略字符数(防止无限循环)。'\n'是终止字符,确保忽略到行尾。
3. 流复位(Reset Stream State)
忽略错误数据后,还需重置流的状态标志(清除failbit和eofbit),使流恢复可用:
// 清除错误标志,使流恢复正常
std::cin.clear();完整示例
假设用户应输入整数,但输入了非数字字符:
#include <iostream>
#include <limits>  // 为 std::numeric_limitsint main() {int num;std::cout << "Enter an integer: ";while (!(std::cin >> num)) {  // 读取失败时std::cerr << "Error: Invalid input. Please enter an integer.\n";// 1. 清除错误标志std::cin.clear();// 2. 忽略当前行的所有内容std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::cout << "Try again: ";}// 流恢复正常后,继续处理正确输入std::cout << "You entered: " << num << std::endl;return 0;
}