EOF的意义及用法(while(scanf(%d,n) != EOF))
EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
在微软的DOS和Windows中,读取数据时终端不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或序列解释为文件结束的指明;最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值通常为 -1,但它依系统有所不同。巨集 EOF会在编译原始码前展开实际值给预处理器。
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
例如:
#include <stdio.h>
int main(){int n;
while(scanf("%d",&n) != EOF){ }return 0;
}
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
在这"scanf("%d",&n) != EOF"相当于"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1 " 。scanf的返回值由后面的参数决定
有小伙伴会问到上面那个程序怎么结束呢?
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。
但是在C++中不存在这种用法,但相同作用的有while((cin >> a) != 0):
以前不理解在while里面用cin >> a;是什么意思,cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。用这个当条件的话,通过检测其流的状态来判断结束;
(1)若流是有效的,即流未遇到错误,那么检测成功;
(2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;读取失败的时候,就不能继续读取了,那么读取操作结束,while(cin>>a)就返回false,跳出循环!
C++中的while (cin>>n,n):
他的作用是:输入一个数,这数不为0时进入循环,为0时跳出循环。
采纳:“https://www.cnblogs.com/tgycoder/p/4958519.html”
输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据,这种情况下cin对键盘上是否有作为流结束标志CTRL+Z或者CTRL+D,其检查的方式有两种:阻塞式以及非阻塞式。
阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。
参考:百度百科。
EOF的意义及用法(while(scanf(%d,n) != EOF))相关推荐
- EOF的意义及用法(while(scanf(“%d“,n) != EOF))
EOF为结束标志,当缓冲里没有东西或者遇到ctrl+z就结束 每次读取长度及类型%d那指定了 参考文章:EOF的意义及用法(while(scanf("%d",&n) != ...
- EOF的用法(while(scanf(“%d“,n) != EOF))和~取反的用法(while(~scanf(“%d“,n)))
文章目录 多组输入输出 输入固定数据量 EOF的用法 ~取反的用法 另一种写法,只针对特定标识符结束 扩展 多组输入输出 我们在做题中会有出现以下的情况, 情况一:题中要求在输入数据第一行给出固定数据 ...
- C语言——EOF的用法——while(scanf(“%d“,num)!=EOF)
简介: EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取.资料源通常称为档案或串流.通常在文本的最后存在此字符表示资料结束.. 概念: 在C语言中,或更 ...
- while(scanf(%d,n)!=EOF) / while(cinn)终止问题
问题的发现:(想要看干货可以直接跳过这段) 我最近刚了解到关于栈的用法,于是按照参考书寻找代码,并把它敲到电脑上.编译运行代码后发现无法终止,在网上查找各种资料,总结如下. 因为我的电脑是Window ...
- 【转】Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法。...
转自:http://hi.baidu.com/zhang_zhu_1/item/5cfcf1a98b86e88a1410733b [转]Hibernate的Generator属性有7种class,本文 ...
- c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...
原标题:嵌入式系统C语言重点语法const.volatile.static.堆栈等的意义及用法 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场. 要点:堆, ...
- duilib各种布局的作用,相对布局与绝对布局的的意义与用法
duilib各种布局的作用,相对布局与绝对布局的的意义与用法 原文 http://blog.csdn.net/zhuhongshu/article/details/38531447 主题 Duili ...
- 【心得】Ctrl+Z、\n、\0、eof的区别和用法
从scanf谈起: 一:scanf的返回值:读入的域的个数 int scanf( const char *format [, argument]... ); int _scanf_l( const c ...
- 计算机网络中tx和fx,100Base-TX/T4/FX以太网意义及用法
100Base-TX/T4/FX以太网意义及用法 活络以太网如今拟定的三种有关传输介质的规范之一,一种是100BASE-TX,别的两种是100BASE-T4.100BASE-FX.咱们将"1 ...
最新文章
- MPB:中科院城环所杨军组-​​​基于DNA宏条形码的水体浮游细菌群落测序建库方法...
- [转]VSTO Office二次开发RibbonX代码结构
- Java数据结构与算法:红黑树
- Solr5.3.1通过copyField设置多个field(字段)同时检索
- 用SAP BSP应用实现图片灰度效果
- Spark Yarn Client模式spark.driver.host导致 Cannot assign requested address: Service ‘sparkDriver‘ failed
- 代理模式(Proxy)--静态代理
- 在EVE虚拟仿真环境里面安装Juniper防火墙,并通过Web做配置
- 移动应用设计领域中最拔尖的15大应用
- ssh 远程连接、上传下载命令
- 数域、有限域(伽罗瓦域)
- PHP7函数大全(4553个函数)
- xhEditor富文本编辑器的使用说明
- 链游:不要只争朝夕,要寄望百年
- 基于VaR模型与CAPM模型的个股日收益率分析报告——以宁德时代(300750)为例
- 什么是数据科学家与数据科学
- 学习型组织的思维方式:保持努力,终身成长!
- gis计算频数_频数 (分析)
- 2009年甲骨文学院教师培训
- hive server2源码地址在哪_实战搭建Thinkphp二次开发威客RW平台源码粉丝关注投票发布系统...