C++中eof(),bad(),fail(),good(),clear()
1、eof()
输入流状态检测如果读文件到达文件末尾,返回true。
问题:
关于输入流状态函数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 起不到流结束的作用。
2、bad()
如果在读写过程中出错,返回true。 例如:当我们要对一个不是打开为写状态进行写入时,或者我们要写入的设备没有剩余空间的时候。
badbit,出现致命错误,一版为硬件错误或系统底层错误,不可挽回。
3、fail()
出了与bad()同样的情况下会返回true以外,加上格式错误也会返回true,例如当想要读入一个整数,但输入了一个字母的时候,或者遇到eof,eof是一种fail,但fail不是一种eof。
failbit,出现非致命错误,可挽回,一般是软件错误。
4、good()
这是最通用的:流处于有效状态,如果调用以上任何一个函数返回true的话,此函数返回false。
4、clear()
标志位一旦被置位,这些标志将不会被改变,要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear,没有参数。比如:通过函数移动文件指针,并不会使eofbit自动重置。
5、测试用例
#include<iostream>using namespace std;int main() {int a;cout << "before a bad input operation:"<< "\n cin.eof():" << cin.eof()<< "\n cin.fail():" << cin.fail()<< "\n cin.bad():" << cin.bad()<< "\n cin.good():" << cin.good() << endl;cin >> a;cout << "after a bad input operation:"<< "\n cin.eof():" << cin.eof()<< "\n cin.fail():" << cin.fail()<< "\n cin.bad():" << cin.bad()<< "\n cin.good():" << cin.good() << endl;cin.clear();cout << "\n cin.eof():" << cin.eof()<< "\n cin.fail():" << cin.fail()<< "\n cin.bad():" << cin.bad()<< "\n cin.good():" << cin.good() << endl;system("pause");return 0;
}
当a的输入为字母时,输出结果:
初始eof,bad,fail置位都是0,good为1,当格式输入错误时,fail被置位为1,good相应就变成0,clear之后重新回到初始状态。
当a的输入时ctrl+z(结束符)时,输出结果:
这时eof也被置位为 1。
C++中eof(),bad(),fail(),good(),clear()相关推荐
- linux中EOF的用法梳理
2019独角兽企业重金招聘Python工程师标准>>> linux中EOF的用法梳理 在linux运维工作中,我们会碰到这样一个场景: 执行脚本的时候,需要往一个文件里自动输入N行内 ...
- Linux中EOF用法
Linux中EOF用法 理解:EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合c ...
- 奥莉嘎!!!ArrayList源码中remove、removeAll、clear方法我又肝了一遍,收获良多
前言 点赞在看,养成习惯. 点赞收藏,人生辉煌. 点击关注[微信搜索公众号:编程背锅侠],第一时间获得最新文章. 看源码血泪史 刚开始工作面试的时候,面试官经常问ArrayList源码相关的问题,基本 ...
- php eof 使用函数_PHP中EOF的用法介绍(附示例)
本篇文章给大家带来的内容是关于PHP中EOF的用法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP EOF(heredoc)是一种在命令行shell(如sh.cs ...
- eof() 和fail()
OF是End Of File 的缩写,表示"文件结束". 从输入流读取数据,如果到达文件末尾(遇到文件结束符),eof函数值为非零值(表示真),如果未到文件结尾则为0(表示假). ...
- matlab中clc,close,close all,clear,clear all作用区别
转自:https://blog.csdn.net/majinlei121/article/details/46605783 clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 close:关 ...
- Eclipse CDT中EOF输入的解决方法
在Xcode中可以用control+D来输入EOF,但是在Eclipse CDT中却老是死机没反应. 解决方法如下: 1.Preference->General->Keys,找到EOF快捷 ...
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- [转] java.nio.ByteBuffer中flip、rewind、clear方法的区别
转载 对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限 ...
最新文章
- Android Gson使用详解
- OpenGL ES之GLSL实现仿抖音“分屏滤镜”效果
- Raft算法的Leader选举和日志复制过程
- wampserver的mysql启动与环境变量设置
- oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...
- git(12)---Git的基础知识
- C语言 — 运算符的优先级与结合性
- java补码运算代码_计算机原码、补码、反码与java移位运算符(//)
- Hibernate的CRUD
- Sublime Text 中配置 Eslint 代码检查和自动修复
- Metasploit Framework —— Exploit
- CST Studio Suite 2020 安装教程
- 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被
- 开源项目_C语言学生个人信息管理系统课程设计_chenjie的博客
- ubuntu 启动、退出 startx界面
- 荣耀上线“荣耀亲选”对标有品,小米要当心了!
- MySQL语法学习笔记
- 小米4可以刷入linux,小米4刷入SailfishOS系统图文教程(附工具)
- 谷歌的android官方刷机,一加手机谷歌原生Android ROM包刷机教程
- 毕业之前要做的20件事
热门文章
- 解决windows下WslRegisterDistribution failed with error: 0x80070050的问题
- 点击编辑框全选内容java,js实现鼠标点击文本框自动选中内容的方法
- [乡土民间故事_徐苟三传奇]第一回_紫禁城派兵破龙胎
- openssl C++ DSA对指定文件内容签名和解签
- 虚幻竞技场脚本源码V1.2公布
- Nervos ——为了更好的世界
- 火币、Nervos联合宣布打造新一代金融基础公链
- 怎样便捷的退出iphone的恢复模式
- Naxsi 配置白名单
- pycharm 出现 Try to run this command from the system terminal. Make sure that you use the correct vers