当前位置: 首页 > news >正文

输入流挂起

1. 输入流挂起(Fail State)

当从输入流(如std::cin)读取数据时,可能因以下原因进入错误状态

  • 类型不匹配:例如读取整数时输入了字母(如"abc")。
  • 文件结束(EOF):输入源被关闭(如 Ctrl+D/Linux 或 Ctrl+Z/Windows)。
  • 流缓冲区损坏:例如读取超过最大长度导致溢出。

此时,流的状态标志(如failbiteofbit)会被设置,流进入挂起状态,后续操作会被阻塞。

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)

忽略错误数据后,还需重置流的状态标志(清除failbiteofbit),使流恢复可用:

// 清除错误标志,使流恢复正常
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;
}

http://www.dtcms.com/a/273961.html

相关文章:

  • Promise :then 与 catch 同时触发
  • AIStarter新版重磅来袭!永久订阅限时福利抢先看
  • 精准安装追踪:openinstall 如何让邀请码绑定更智能?
  • 瑞士四种官方语言探秘:多元文化的和谐交融
  • 用Netplan配置网桥bridge笔记250711
  • 飞算 JavaAI:开启 Java 开发新时代
  • 单链表,咕咕咕
  • 使用 Python 对本地图片进行图像分类
  • 镜像(Mirror/Image)
  • 飞算JavaAI:革新Java开发的智能助手
  • 100G系列光模块产品与应用场景介绍
  • 7.12 note
  • 【实时Linux实战系列】硬实时与软实时设计模式
  • Vue3 Pinia
  • 深入MyBatis:CRUD操作与高级查询实战
  • mac电脑的usr/libexec目录是干什么的?
  • 「Linux命令基础」文本模式系统关闭与重启
  • Linux 内存管理之LRU链表
  • 蓝牙协议栈高危漏洞曝光,攻击可入侵奔驰、大众和斯柯达车载娱乐系统
  • HTTPS安全机制:从加密到证书全解析
  • 意识边界的算法战争—脑机接口技术重构人类认知的颠覆性挑战
  • React 的常用钩子函数在Vue中是如何设计体现出来的。
  • 苹果UI 设计
  • 前端面试专栏-算法篇:23. 图结构与遍历算法
  • 4.丢出异常捕捉异常TryCatch C#例子
  • 使用gdal读取shp及filegdb文件
  • C/C++动态内存管理函数详解:malloc、calloc、realloc与free
  • Launcher3桌面页面布局结构
  • JavaScript加强篇——第四章 日期对象与DOM节点(基础)
  • 基于 HT 技术的智慧交通三维可视化技术架构与实践