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

输入流挂起

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.xdnf.cn/news/15278.html

相关文章:

  • 人脸图像生成(DCGAN)
  • Java线程进阶-并发编程
  • python的病例管理系统
  • halcon 求一个tuple的极值点
  • 性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力
  • 深入剖析Spring Bean生命周期:从诞生到消亡的全过程
  • JavaSE——Object
  • Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
  • DSSA(Domain-Specific Software Architecture)特定领域架构
  • 台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)
  • Leaflet面试题及答案(21-40)
  • 2025年体育科学与健康大数据国际会议(ICSSHBD 2025)
  • OpenAI 将推 AI Agent 浏览器:挑战 Chrome,重塑上网方式
  • 异构Active DataGuard对于convert参数的错误理解
  • SpringCloud之Feign
  • 从「小公司人事」到「HRBP」:选对工具,比转岗更能解决成长焦虑
  • 十二、k8s工程化管理Helm
  • Linux自动化构建工具(一)
  • pdf拆分
  • 《打破预设的编码逻辑:Ruby元编程的动态方法艺术》
  • LVS负载均衡-DR模式配置
  • 进制转换原理与实现详解
  • 【unity编辑器开发与拓展EditorGUILayoyt和GUILayoyt】
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (三)RISC-V架构深度解剖(下)
  • 【八股消消乐】浅尝Kafka性能优化
  • 【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)
  • Vue集成MarkDown
  • 开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2
  • UC浏览器PC版自2016年后未再更新不支持vue3
  • Git Submodule 介绍和使用指南