关于输入流状态函数cin.eof()的问题
问题:
关于输入流状态函数cin.eof()的问题
int main()
{char gc;
while(!cin.eof()) //直至按ctrl+z键退出!
{
cin>>gc;
cout<<gc<<endl;
}
cout<<cin.eof()<<endl<<cin.fail()<<endl<<cin.bad()<<endl;
}
《c++ primer》上说的是遇到文件结束符 cin.eof返回ture,可是我在vc++ 6.0上运行非得输入两个^z才返回ture 是什么原因~?
解答:
while(cin) 的退出条件就是两次ctrl+z加两个回车符。
cin是终端输入,也被称之为标准输入(standard input),cin的主要功能就是从标准输入读入一个值。
当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键按下作出检查。其检查的方式有两种:阻塞式以及非阻塞式。
1)阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查;
2)非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。
如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。这种阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点就是:如果输入缓冲区中有可读的数据则不会检测Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道:Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。
例:从键盘上输入abcd^z 加 回车之后在Windows系统上是这样处理的:由于回车的作用,前面的 abcd 等字符被送到输入缓冲区(注意:上面说过了,^z不会产生字符,所以更不会存储到输入缓冲区,缓冲区中没有 ^z 的存在)。这时,cin.get() 检测到输入缓冲区中已经有数据存在(因此不再检查是否有 ^z 的输入),于是从缓冲中读取相应的数据。如果都读取完了,则输入缓冲区重新变为空,cin.get() 等待新的输入。可见,尽管有 ^z 按下,但是由于在此之前还有其它输入字符(abcd),所以流也不会结束。
因此,输入流结束的条件就是:^z 之前不能有任何字符输入(回车除外),否则 ^z 起不到流结束的作用。
关于输入流状态函数cin.eof()的问题相关推荐
- C++中eof(),bad(),fail(),good(),clear()
1.eof() 输入流状态检测如果读文件到达文件末尾,返回true. 问题: 关于输入流状态函数cin.eof()的问题 int main() {char gc; while(!cin.eof()) ...
- C++ cin相关函数总结
输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...
- 关于fflush、缓冲区、scanf、EOF等问题真麻烦
1.为什么 fflush(stdin)是错的 http://u637.springnote.com/pages/6288463.xhtml(已经bad request了) 首先请看以下程序: #inc ...
- 02头文件的冲突导致,清除缓冲区失败之cin.ignore() 问题
输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl + z) [每行最多保存4个整数] 可能遇到的 ci ...
- C++ cin 详解之终极无惑
代码编译运行环境:VS2017+Win64+Debug. 文章目录 1.简介 2.常用输入方法 2.1 cin>> 的用法 2.2 cin.get() 的用法 2.2.1 cin.get( ...
- cin.ignore()函数的使用
ignore函数 功能:函数用于输入流.它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF). 其调用形式为cin.ignore(n,终止字符) 原型: ...
- (转)cin cin.get cin.getline cin
(转)cin cin.get cin.getline cin<<的结束符有enter space tab cin.get()的结束符只有enter,但会把enter放入队列等待 cin.g ...
- cin.ignore在Vs2019中报错提示应输入表示符的解决方案
在vs2019中使用cin.ignore(std::numeric_limits::max(), '\n'); 编译器提示 max() 应输入标识符 修改成: cin.ignore((std::num ...
- cin.clear()及相关用法
1. cin.clear() 是用来更改cin的状态标示符的. cin.sync()是用来清除缓存区的数据流的. 如果标示符没有改变那么即使清除了数据流也无法输入.所以两个要联合起来使用. 我们定义要 ...
最新文章
- 在Ubuntu 14.04.5 LTS上安装python模块selenium 3实录
- Windows程序设计------字体不等宽引出的问题及其细节知识
- thymleaf用法例子
- SOJ 4543 4542
- Oracle提示错误消息ORA-28001: the password has expired
- 学习笔记(九)——JSON 和 AJAX
- 最短Hamilton路径(状压dp)
- cocos2dx + vs安装使用
- leetcode 125. 验证回文串
- kafka的版本问题
- php arff文件,python实现txt文件格式转换为arff格式
- python多进程map比apply快_python 多进程读写 map
- echarts中tooltip提示框位置控制
- 微信小程序模拟器里面不能显示自己写的INDEX
- 怎样免费将Word导出为PDF格式?
- 3dmax顶点动画导入unity_用3dMax给lol人物模型制作表情动画并导入Unity
- 新手入门matlab之线性系统频域分析
- java中import是什么意思_java中import关键字是什么意思
- ipad浏览器安装java_在桌面浏览器中调试iphone、ipad等设备上的网页
- 计算机键盘上clr是什么意思,CLR是什么意思
热门文章
- 过滤器实现自动登录(过滤器filter)
- 数学建模问题的python相关代码
- C语言人民币的构造的关键,C语言程序设计 教学课件 任文 孔庆彦电子课件 全书习题及习题参考答案 第2章 C程序设计的初步知识.pdf...
- pandas 从dataframe A剔除 dataframe B包含的行
- 小白教程----python(保姆级教程)
- Docker+PHP环境配置和负载
- Coursera近期新推了一个金融和机器学习的专项课程系列
- 人脸识别SDK识别速度测试报告
- 2023最新云喵兴趣社区圈子小程序源码+ThinkPHP内核开发
- SHA1算法的编程实现