热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cin的个人理解

标准输入设备cin是指从键盘输入数据,而我们知道从键盘输入的时候是使用了缓冲的(windows中是行缓冲),系统将输入数据放到程序的缓存内存中是以Enter键为标志的。也就是说

标准输入设备cin是指从键盘输入数据 , 而我们知道从键盘输入的时候是使用了缓冲的(windows中是行缓冲) ,系统将输入数据放到程序的缓存内存中是以Enter键为标志的。

也就是说 我们输入了一行数据(可以只一个字符或者N个字符时)时,这些数据先是被系统检测到后存放在系统的某处(如系统中的内存,但不是程序的内存中),  而只有当我们按下Enter键后,系统才会将输入的这一行数据存放到我们的程序的输入缓存中.


例如:假设我们程序的输入缓存用char buf[MAX_SIZE]数组表示,

那么当我们遇到第一条输入语句cin>>x>>y>>z;(假设为char类型),由于是第一次程序中的第一条输入,故此时的输入缓存还是空的。程序运行到此处时会先检测自已的输入缓存是否为空。如果为空,则会再检测是否遇到结束符EOF (EOF标志并不出现在输入缓存中) 。如果遇到EOF,则输入语句直接返回;如果没有遇到EOF结束标志,则输入操作将阻塞,即程序暂停等待用户输入。

然后我们开始输入数据,但是在我们按下回车符之前,行缓存都一行为空,程序就一直等待。直到我们按下Enter后,
我们输入的数据比如为"abcde"才会被系统存放到程序的输入缓存中。这时候cin>>x>>y>>z;就会发现输入缓存不为空了。然后x,y,z就会分别读入数据了。x='a' ,y ='b', z= 'c';     注意,此时程序的输入缓存中的数据并没完 即”de" 还在缓存里。

程序继续运行到某处的输入语句cin>>u>>v >>w; (也为char类型)  ,然后发现输入缓存中还有数据,则u = 'd' ,v = 'e'; 但将给w赋值的时候发现没数据了,此同就同上了,程序又开始等待  (同上)  .

验证程序(c++):

int main()
{
char x,y,z,u,v,w;
cout<<"Please enter the data :";
cin>>x>>y>>z;
cout<<"then x = "<int main()
{
int x = 0;
cout<<"enter a data for int x:";
cin>>x;
cout<
char c = 'p';
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "< cin.clear(); //清除cin的错
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "<}

  • 再来看看while(cin>>x)结束的方式  (x为任意类型)
1.可以用 上面的方法,使cin的标志位置为false.但这种方法得在while后面再用cin前,使用cin.clear()清除错误。  (cin>>x的返回值为cin的引用.相当于cin>>x,while(cin){})
2.可以在输入新的一行时输入^z   (键盘上按下 ctrl+z) 回车,这种情况下cin也标志位也会置为false.  注意:^z得出现在输入的每行的第一个才有效!

下面就我个人理解来解释下 ^z:

^z 相当于文件输入流的EOF标志。

从上面可知cin>>x的时候,程序是先检测输入缓存是否为空。若为空,则再检测EOF标志。若无EOF,则程序等待用户输入。注:^z并不会进入到输入缓存中

每按一次回车时候,程序就执行下上面的步骤。 

我们可以认为 ^z 符号只在一次回车时有用。即当输入 'abc'^z的时候, 程序执行不到检测EOF时,就已经有输入了(此时这次的^z就已经失效了,因为它的前面有输入了)

故:^z ( ctrl+z)结束时,得在行首输入!  后面要再次使用cin时,得再调用cin.clear();

验证如下:

int main()
{
int c;
while(cin>>c){
cout<<"in while"< cout<<"请在行首按下^z结束(ctrl+z) 或者输入字母结束 "< }
cout<<"cin 的状态:"<<(bool)cin< cin.clear();//然后就可以接着用cin了
}



本文完。如有错误,还请各个高手指正。

转载请注明出处.







推荐阅读
  • CC++如何复制 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • ProblemDescriptionAninchwormisatthebottomofawellninchesdeep.Ithasenoughene ... [详细]
  • Here是指向最小代码的链接,如果消失了, ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 由CStringW(wchar_t)不能正常打印收集的
    WIN7、VS2010(工程字符集为Unicode):源代码如下:CStringWline;rs是ODBC取得的结果集(有汉字),调试发现line能成功读取line.Form ... [详细]
  • 结构体在内存中的对齐规则
    一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include<iostream ... [详细]
author-avatar
区小靜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有