C++——cin输入

news2024/11/26 2:51:56

cin对象在抽取过程中会进行类型转换,这应该是根据字节数来的,对于每一种类型,都会有相应的指令合集,也就是cpu会按字节进行转换,区别在于大端模式或者是小端模式,cin对象从在了<<相应的函数被称为格式化输入函数,他们将数据转化为指定的格式;除此之外cin会检查输入;

流状态——cin的异常机制

cin,cout都包含一个描述流状态的数据成员,流状态是一种枚举或常量,他有三个成员:

eofbit,badbit,failbit每个元素都是一位,可设置为1或0,cin操作到文件尾时,他将设置eofbit,未能读取到预期的字符时,他将设置failbit,当破坏流的失败无法预测时,他将设定badbit,当三个状态全部为0时,那就是一切顺利,这就是异常机制,程序可以检查流状态,利用这种信息来决定下一步做什么:

CPP有专门的方法来报告流状态或改变流状态:

 设置状态的函数:

clear(),setstate();他们将重置状态;clear清除围在形参列表里的状态值,setstate()则指影响形参的位;

IO状态和异常:

clear()或者setstate()设置流状态后不一定会引发异常,需要与exceptions()返回值进行比较,若返回值的某一位被设置,当前状态的对应位也被设置,那么clear()将引发ios_base::failure异常,例如两个都是badbit,如果exceptions()返回goodbit,那么将不会引发异常,ios_base::failure是从std::exception类派生而来,因此它包含一个what()方法;

使用exceptions(iostate)将表示设置哪些流状态会引发异常,这里使用OR位运算符可以指定多个参数:

cin.exceptions(badbit|eofbit|failbit);
此时这三个位任何一个被设置都将引发异常

 用cin.exceptions(iostate)指出哪个位被设置会引发异常,我们回顾一下,eofbit指的是读到文件尾时,failbit未读到预期的字符时,badbit指无法诊断的失败破坏流时,将他们传入exceptions后,读入过程中位被设置则引发异常;


	cin.exceptions(ios_base::failbit);
这段代码指出,当流读到与预期字符不符的类型时将引发异常;
	int input;
	int sum = 0;
	try {
		while (cin >> input)
		{
			sum += input;
		}
	}
	catch (ios_base::failure& bf)
	{
		cout << bf.what();
		cout << "O!the error\n";
	}
	cout << "Last value entered=" << input<<endl;
	cout<<"Sum = "<<sum<<endl;

流状态的影响:

设置流状态位后,流将对后面的输入输出关闭,知道位被清除(用clear()),此后为了继续读入,必须跳过错误,对于failbit,使用isspace(cin.get())跳过字符一直到空白字符处,即两步:

1.用clear()重置状态;

2.跳过错误,(对于failbit使用isspace(cin.get())到达空白字符处)

cin.exceptions(ios_base::failbit);
while (cin >> input) {
		sum += input;
	}

	cin.clear();
重置位
	while (!isspace(cin.get())) {
		continue;
	}
跳过非空白字符;
	cin >> input;

与上边的while循环效果相同
while (cin.get()!='\n') {
		continue;
	}

下边是包含异常后的程序代码:


	cin.exceptions(ios_base::failbit);
这段代码指出,当流读到与预期字符不符的类型时将引发异常;
	int input;
	int sum = 0;

while (cin >> input) {
		sum += input;

	}
		cout << "Last value entered=" << input << endl;
		cout << "Sum = " << sum << endl;


		if (cin.fail() && !cin.eof()) {
			cin.clear();
			while (!isspace(cin.get())) { continue; }
		}
		else {
			cout << "i can not go on!\n";
			exit(1);
		}

		cout << "Now enter a new number: ";

		cin >> input;

其他istream方法:get()和getline();

他们被称为非格式化函数,因为他们只是读取字符输入,并不进行数据类型转换;

get(char*,int ,char)和getline(char*,int,char)在默认情况下读取的是一整行(知道换行符\n)而不是一个单词;

get(char&)和get(void)提供不跳过空白的单字符输入功能;

单字符输入:

get()读取下一个输入字符,他们只能通过模拟文件尾来终止,cin可以通过上边的异常设置终止;

字符串输入:getline(),get(),ignore();

第一个参数是字符串首地址,第二个参数比要读取的最大字符数大1,(留一个位存放空字符,以存放C风格的字符串),第三个参数指定用作分界符的字符,只有两个参数的版本将换行符用作分界符,上述函数都在读取最大数目的字符或遇到换行符后为止,get()与getline()的区别是getline()将不保留换行符;get()将保存;对于分界符两个函数的方法是一样的;

ignore(int,char),第一个是能读取的最大字符数,第二个是分界符,ignore读取分界符之后的字符,之前的全部丢弃,除非达到最大字符数值,

istream&ignore(int =1,int =EOF);默认参数EOF将导致函数读取指定数目的字符或者读取到文件尾;

//ignore()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陪诊APP开发服务兼职软件

陪诊APP是一种提供陪伴照顾服务的应用程序&#xff0c;主要面向需要医院陪护的病人及家属。以下是可能有助于陪诊APP开发服务兼职软件的功能&#xff1a; 注册和登录&#xff1a;允许用户使用手机号码等方式注册并登录账户。 病房预约&#xff1a;允许家属为病人预约病…

数据烦恼?亮数据平台为你提供一站式解决方案

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 在当今数字时代&#xff0c;大型和实时的数据集具有更全面的信息、更准确的预测、和更好的竞争优势。作为一位刚被数据折磨过的人&#xff0c;我必须要把自己的经验跟大家分享一下&#xff0c;让大家和公司在收集数据方面…

构筑数字化新引擎!美创助力金华银行核心系统国产分布式数据库迁移

近日&#xff0c;金华银行举行“星辉工程”核心项目群上线发布会&#xff0c;新一代核心系统成功部署在国产分布式数据库OceanBase&#xff0c;向业务高效创新、数智赋能迈出了重要一步。据悉&#xff0c;这是浙江省首例基于完全国产自研数据库落地的银行核心系统。 此次“星辉…

[PyTorch][chapter 43][时间序列表示方法1]

前言&#xff1a; 语言模型&#xff08;LM&#xff09;起源于语音识别(speech recognition)&#xff0c;输入一段音频数据&#xff0c;语音识别系统通常会生成多个句子作为候选&#xff0c;究竟哪个句子更合理&#xff1f;就需要用到语言模型对候选句子进行排序。 language mod…

【算法题解】40. 数组的度

这是一道 简单 题 https://leetcode.cn/problems/degree-of-an-array/ 题目 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返…

谈找工作途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉钩 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…

QT日历制作

文章目录 前言一、QCalendar 类介绍二、界面布局三、代码讲解1. lable 添加图片2. 设置主窗口背景色3. 日历显示改变网格线颜色4. 显示表头日期 总结 前言 在 Qt 中&#xff0c;QCalendar 类是提供日历功能的类。它用于操作和管理日期和时间信息&#xff0c;包括日期计算、日期…

为什么黑客不黑赌博软件?如何成为一名顶级黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

JDK新手无脑安装配置教程❤❤❤ JDK下载网址 ps&#xff1a;如果你的JDK版本在官网没有找到&#xff0c;可以通过第三方资源进行下载&#xff0c;下载安装配置教程是通用的 官方链接>https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 安装步骤…

【Leetcode60天带刷】day17二叉树——110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

题目&#xff1a; 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离…

DJ4-4 NAT、ICMP、IPv6

目录 一、NAT&#xff1a;网络地址转换 1、工作原理 2、NAT 的限制 二、ICMP 1、ICMP 协议 2、ICMP 类型和代码 3、Traceroute 命令 三、IPv6 地址 1、IPv6 的引入 2、IPv6 的表示 一、NAT&#xff1a;网络地址转换 动机&#xff1a;对外部网络来讲&#xff0c;本地…

RISC-V处理器的设计与实现——基本指令集

本人小白一枚&#xff0c;在学习FPGA的过程中偶然刷到了tinyriscv这个开源项目&#xff0c;并且自己对计算机体系结构的知识也很感兴趣&#xff0c;所以想参考这个开源项目做一个基于RISC-V指令集的CPU&#xff0c;下面是tinyriscv这个开源项目的地址&#xff0c;本项目很多思路…

优思学院|六西格玛倡导者与项目赞助人是什么角色?有何区别?

倡导者&#xff08;Champion&#xff09;和项目赞助人&#xff08;Sponsor&#xff09;在正式的六西格玛的组织架构中是两个不同的角色&#xff0c;所以希望在这篇文章中解释一下两个角色的区别。 倡导者&#xff08;Champion&#xff09;是负责组织竞争力和增长的董事和高管&…

quartus 无法识别usb blaster

一、Windows无法正常驱动USB-Blaster 问题:驱动问题 解决方法: 右键我的电脑->管理->设备管理器找到设备USB-Blaster,此时是带有黄色感叹号的 3.右键->更新驱动程序软件 4. 选择“浏览计算机以查找驱动程序软件(R)”,如选择自动搜索是不能安装成功的,…

jQuery 基础语法使用指南

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 引入 jQuery 2. jQuery 语法 3. 选择器 …

FusionComputeV100R006C10SPC101平台安装win10踩坑记

生产环境中有一套华为FusionCompute&#xff0c;版本比较老&#xff0c;V100R006C10SPC101&#xff0c;该产品已EOS了&#xff0c;无法升级。因业务需要&#xff0c;需安装Windows10系统&#xff0c;遇到了不少坑&#xff0c;在此记录一下。 一、坑1&#xff1a;Windows10版本…

CAN总线终端电阻

CAN总线终端电阻&#xff0c;一般来说都是120欧姆&#xff0c;实际上在设计的时候&#xff0c;也是两个60欧姆的电阻串起来&#xff0c;而总线上一般有两个120Ω的节点&#xff0c;基本上稍微知道点CAN总线的人都知道这个道理。 但是这两个终端电阻的具体作用是什么呢&#xf…

迅为视频教程 | RKNPU2 从入门到实践一套搞定!

迅为基于瑞芯微RK3568和RK3588处理器设计开发的两款开发板都自带NPU&#xff0c;RK3568自带1T算力的NPU、RK3588自带&#xff16;T算力的NPU&#xff0c;且这两款开发板使用的都是RKNPU2。 &#xff08;RKNPU发展历程&#xff09; RKNPU2较RKNPU1有较大的提升&#xff0c;但市面…

Unity核心9——3D动画

一、3D 动画的使用 ​ 使用导入的 3D 动画&#xff1a; 将模型拖入场景中为模型对象添加 Animator 脚本为其创建 Animator Controller 动画控制器&#xff08;状态机&#xff09;将想要使用的相关动作&#xff0c;拖入 Animator Controller 动画控制器&#xff08;状态机&…