问题:

关于输入流状态函数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()的问题相关推荐

  1. C++中eof(),bad(),fail(),good(),clear()

    1.eof() 输入流状态检测如果读文件到达文件末尾,返回true. 问题: 关于输入流状态函数cin.eof()的问题 int main() {char gc; while(!cin.eof()) ...

  2. C++ cin相关函数总结

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  3. 关于fflush、缓冲区、scanf、EOF等问题真麻烦

    1.为什么 fflush(stdin)是错的 http://u637.springnote.com/pages/6288463.xhtml(已经bad request了) 首先请看以下程序: #inc ...

  4. 02头文件的冲突导致,清除缓冲区失败之cin.ignore() 问题

    输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl + z) [每行最多保存4个整数] 可能遇到的 ci ...

  5. C++ cin 详解之终极无惑

    代码编译运行环境:VS2017+Win64+Debug. 文章目录 1.简介 2.常用输入方法 2.1 cin>> 的用法 2.2 cin.get() 的用法 2.2.1 cin.get( ...

  6. cin.ignore()函数的使用

    ignore函数 功能:函数用于输入流.它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).   其调用形式为cin.ignore(n,终止字符) 原型: ...

  7. (转)cin cin.get cin.getline cin

    (转)cin cin.get cin.getline cin<<的结束符有enter space tab cin.get()的结束符只有enter,但会把enter放入队列等待 cin.g ...

  8. cin.ignore在Vs2019中报错提示应输入表示符的解决方案

    在vs2019中使用cin.ignore(std::numeric_limits::max(), '\n'); 编译器提示 max() 应输入标识符 修改成: cin.ignore((std::num ...

  9. cin.clear()及相关用法

    1. cin.clear() 是用来更改cin的状态标示符的. cin.sync()是用来清除缓存区的数据流的. 如果标示符没有改变那么即使清除了数据流也无法输入.所以两个要联合起来使用. 我们定义要 ...

最新文章

  1. 在Ubuntu 14.04.5 LTS上安装python模块selenium 3实录
  2. Windows程序设计------字体不等宽引出的问题及其细节知识
  3. thymleaf用法例子
  4. SOJ 4543 4542
  5. Oracle提示错误消息ORA-28001: the password has expired
  6. 学习笔记(九)——JSON 和 AJAX
  7. 最短Hamilton路径(状压dp)
  8. cocos2dx + vs安装使用
  9. leetcode 125. 验证回文串
  10. kafka的版本问题
  11. php arff文件,python实现txt文件格式转换为arff格式
  12. python多进程map比apply快_python 多进程读写 map
  13. echarts中tooltip提示框位置控制
  14. 微信小程序模拟器里面不能显示自己写的INDEX
  15. 怎样免费将Word导出为PDF格式?
  16. 3dmax顶点动画导入unity_用3dMax给lol人物模型制作表情动画并导入Unity
  17. 新手入门matlab之线性系统频域分析
  18. java中import是什么意思_java中import关键字是什么意思
  19. ipad浏览器安装java_在桌面浏览器中调试iphone、ipad等设备上的网页
  20. 计算机键盘上clr是什么意思,CLR是什么意思

热门文章

  1. 过滤器实现自动登录(过滤器filter)
  2. 数学建模问题的python相关代码
  3. C语言人民币的构造的关键,C语言程序设计 教学课件 任文 孔庆彦电子课件 全书习题及习题参考答案 第2章 C程序设计的初步知识.pdf...
  4. pandas 从dataframe A剔除 dataframe B包含的行
  5. 小白教程----python(保姆级教程)
  6. Docker+PHP环境配置和负载
  7. Coursera近期新推了一个金融和机器学习的专项课程系列
  8. 人脸识别SDK识别速度测试报告
  9. 2023最新云喵兴趣社区圈子小程序源码+ThinkPHP内核开发
  10. SHA1算法的编程实现