输入流挂起
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;
}