我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++cin不同状态详细讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++cin不同状态详细讲解

前言

在C++中std::cin>>x,这是一条从std::cin中读取输入到x中的语句。而>>操作数是从标准输入中读取一个字符串,并把它保存在x对象中。

读取操作包括:

1、从输入流缓冲区缓存的输入字节快中提取对应于右操作数数据类型的字节字块。如果缓存为空,则等待输入设备提交字节块。

2、再将字节子块转换为右操作数对应类型的编码存放在右操作数中。

对于cin之类的流对象有good和not good两种状态,cin>>x读取数据成功时,会返回good状态;cin>>x读取数据失败时,会返回not goot状态。注意good状态的流才能读/写流缓冲区的数据;not good状态的流会忽略即不执行读/写操作。

反过来,流的读/写操作也会影响流的状态,成功的读/写操作会使流保持good状态;失败的读/写操作会设置流的状态变量的错误标志,表示流在读/写操作后处于某种错误(not good)的状态。

流的错误状态可以分为failbit、eofbit和badbit三种错误状态。

常量failbiteofbitbadbit转为10进制
ios::failbit1004
ios::eofbit0102
ios::badbit0011
ios::goodbit0000

基本读取状态的函数rdstate(),其余状态读取函数是good()、fail()、eof()、bad()等。

三种错误状态:

  • fail():读取值与期望接受值的类型不兼容即错误格式,状态变量的failbit被置位,fail()为真,进入fail状态。这种错误是可恢复的,可重新设置流为good状态,继续读取数据,但需要丢弃前面输入的数据。
  • eof():读取值为文件结束标记eof,此时cin会记录该标记,状态变量的eodbit和failbit被同时置位,eof()为真,进入eof状态。
  • bad():由于输入设备故障导致的数据丢失,状态变量的badbit和failbit被置位,bad()为真,进入bad状态,这种错误不可恢复,流对象将不可再用。

注意:当流处于错误状态时,状态变量的failbit总是被置位(true),因此有时候也可以将表达式!fail()作为判断流是否为good的条件来使用。

介绍一下cin的三个函数:

  • cin.clear():是用来更改cin的状态标识符的,将cin的所有状态值重设为有效值。
  • cin.sync():是用来清除缓存区的数据流的。
  • cin.ignore(n,ch):从输入流中提取字符,提取的字符被忽略,不被使用,每抛弃一个字符,它都要计数和比较字符,如果计数值达到n或者被抛弃的字符是ch,则cin.ignore()函数执行终止,否则继续等待。

注意:当cin出错时,先要用cin.clear()重置cin状态值后,后面两个函数才能起到作用,但cin.ignore()要比cin.sync()更加灵活。

一、下面给几个案例

#include <iostream>
using namespace std;
int main()
{
    int x;
    cout << "请输入一个整数:";
    cin >> x;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

1、输入正确且类型匹配的情况:

2、输入一个字符时,类型不匹配的情况:

3、以eof结尾:

(在Windows下是输入Ctrl+z,Linux下是输入Ctrl+d,都要进行换行后再输入)

二、当我们对这个程序进行改进后

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "请输入一串整数:";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    char y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

在代码中用了一个循环输入,提示输入一串整数,在前面四个数都是整数的情况下,而第五个数输入了一个字符,后面两个数仍然是整数,但是当执行时,sum的值却是14,也就是说x成功保存了四个数,这就是上面说的fail错误状态,x不能再读出流缓冲区的数据,这是因为第五个数是字符类型的,与x类型不匹配,再用clear()函数重置cin状态,由于y是char类型,z是int类型,后面的cin>>y和cin>>z又可以继续读出流缓冲区里的数据。

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "请输入一串整数:";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    cout << " clear后:" << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    int y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

这里只是将上面的char y改成了int y,可以看运行结果的不同,此时的cin.clear()虽然起作用,但由于流缓冲区里还有数据,y和z会尝试去读取里面的数据,而y的类型不匹配再次让流的状态变成fail状态,y和z就都不能读取数据了,输入y和z的值是程序自动初始化的。

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "请输入一串整数:";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    cin.sync();
    int y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

当在cin.clear()后面加上cin.sync()函数后,sync()函数会清除缓存区的数据,此时缓存区里面就没有数据了,对于cin>>y和cin>>z,就需要我们自己输入数据了。

总结

对于cin的错误状态,我们可以用cin的其他几个函数将其恢复成good状态,cin.clear()一般和cin.sync()一起使用。

参考书籍:Accelerated C++和Cpp_Primer_5

到此这篇关于C++ cin不同状态详细讲解的文章就介绍到这了,更多相关C++ cin内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++cin不同状态详细讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++cin不同状态详细讲解

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream类的对象
2022-11-13

C++BoostMetaStateMachine定义状态机超详细讲解

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-12-08

MySQL查看数据库状态命令详细讲解

目录前言show statusshow processlist;show slave status \G;总结前言数据查询语言(DQL: Data Query Language):其语句,也称为“数据检索语句”,用
2023-03-06

Vue状态机的开启与停止操作详细讲解

Vuex是专门为Vuejs应用程序设计的状态管理工具,这篇文章主要给大家介绍了关于Vuex状态机快速了解与实例应用的相关资料,需要的朋友可以参考下
2023-01-05

超详细讲解Linux C++多线程同步的方式

目录一.互斥锁1.互斥锁的初始化2.互斥锁的相关属性及分类3.测试加锁函数二.条件变量1.条件变量的相关函数三.读写锁1)初始化的销毁读写锁2)以写的方式获取锁,以读的方式获取锁,释放读写锁四.信号量1)信号量初始化2)信号量值的加减3)对
2022-06-04

ReactNative全面屏状态栏和底部导航栏适配教程详细讲解

最近在写ReactNative项目,调试应用时发现顶部状态栏和底部全面屏手势指示条区域不是透明的,看起来很难受。研究了一下这个问题,现在总结一下解决方案,这篇文章主要介绍了ReactNative全面屏状态栏和底部导航栏适配教程
2023-01-28

javascript当前元素将要进入编辑状态使用什么函数,详细讲解

JavaScript中用于使元素可编辑的函数是contenteditable。它允许设置属性值为"true"以启用编辑,或"false"以禁用编辑。该属性广泛用于创建文本编辑器、富文本编辑器等可编辑区域,并支持各种事件处理更改和键盘输入。然而,应谨慎使用,以避免性能问题和确保输入验证。
javascript当前元素将要进入编辑状态使用什么函数,详细讲解
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录