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()相关推荐

  1. linux中EOF的用法梳理

    2019独角兽企业重金招聘Python工程师标准>>> linux中EOF的用法梳理 在linux运维工作中,我们会碰到这样一个场景: 执行脚本的时候,需要往一个文件里自动输入N行内 ...

  2. Linux中EOF用法

    Linux中EOF用法 理解:EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合c ...

  3. 奥莉嘎!!!ArrayList源码中remove、removeAll、clear方法我又肝了一遍,收获良多

    前言 点赞在看,养成习惯. 点赞收藏,人生辉煌. 点击关注[微信搜索公众号:编程背锅侠],第一时间获得最新文章. 看源码血泪史 刚开始工作面试的时候,面试官经常问ArrayList源码相关的问题,基本 ...

  4. php eof 使用函数_PHP中EOF的用法介绍(附示例)

    本篇文章给大家带来的内容是关于PHP中EOF的用法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP EOF(heredoc)是一种在命令行shell(如sh.cs ...

  5. eof() 和fail()

    OF是End Of File 的缩写,表示"文件结束". 从输入流读取数据,如果到达文件末尾(遇到文件结束符),eof函数值为非零值(表示真),如果未到文件结尾则为0(表示假). ...

  6. matlab中clc,close,close all,clear,clear all作用区别

    转自:https://blog.csdn.net/majinlei121/article/details/46605783 clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 close:关 ...

  7. Eclipse CDT中EOF输入的解决方法

    在Xcode中可以用control+D来输入EOF,但是在Eclipse CDT中却老是死机没反应. 解决方法如下: 1.Preference->General->Keys,找到EOF快捷 ...

  8. java.nio.ByteBuffer中flip、rewind、clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

  9. [转] java.nio.ByteBuffer中flip、rewind、clear方法的区别

    转载 对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限 ...

最新文章

  1. Android Gson使用详解
  2. OpenGL ES之GLSL实现仿抖音“分屏滤镜”效果
  3. Raft算法的Leader选举和日志复制过程
  4. wampserver的mysql启动与环境变量设置
  5. oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...
  6. git(12)---Git的基础知识
  7. C语言 — 运算符的优先级与结合性
  8. java补码运算代码_计算机原码、补码、反码与java移位运算符(//)
  9. Hibernate的CRUD
  10. Sublime Text 中配置 Eslint 代码检查和自动修复
  11. Metasploit Framework —— Exploit
  12. CST Studio Suite 2020 安装教程
  13. 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被
  14. 开源项目_C语言学生个人信息管理系统课程设计_chenjie的博客
  15. ubuntu 启动、退出 startx界面
  16. 荣耀上线“荣耀亲选”对标有品,小米要当心了!
  17. MySQL语法学习笔记
  18. 小米4可以刷入linux,小米4刷入SailfishOS系统图文教程(附工具)
  19. 谷歌的android官方刷机,一加手机谷歌原生Android ROM包刷机教程
  20. 毕业之前要做的20件事

热门文章

  1. 解决windows下WslRegisterDistribution failed with error: 0x80070050的问题
  2. 点击编辑框全选内容java,js实现鼠标点击文本框自动选中内容的方法
  3. [乡土民间故事_徐苟三传奇]第一回_紫禁城派兵破龙胎
  4. openssl C++ DSA对指定文件内容签名和解签
  5. 虚幻竞技场脚本源码V1.2公布
  6. Nervos ——为了更好的世界
  7. 火币、Nervos联合宣布打造新一代金融基础公链
  8. 怎样便捷的退出iphone的恢复模式
  9. Naxsi 配置白名单
  10. pycharm 出现 Try to run this command from the system terminal. Make sure that you use the correct vers