目录

EOF是什么?

EOF搭配while的实际应用场景1

EOF搭配while的实际应用场景2

补充

后言


EOF是什么?

EOF, 在C语言的标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。

在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127(ASCII的取值范围应该为0~255,0~127保留的是英文、数字和标准符号,128~255是后面进行拓展的ASCII),不可能出现-1,但正好EOF是定义在头文件的常量EOF的本质是-1(ASCLL)。因此可以用EOF作为文件结束标志

还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。


EOF搭配while的实际应用场景1

#include int main(){int n;while(scanf("%d",&n) != EOF){ }return 0;}

当上面的程序运行时,如果不加” != EOF”,那么这个程序就是个死循环,会一直运行下去。

但如果加上” != EOF”后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束。

(while的意思就是说当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)


如何结束程序呢?

在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”。

因此需要用组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while。

以下题为例:

·从上代码可见,在VS2019的情况下,需要三次组合键

·上面我们说了EOF的本质是-1,这里又有小伙伴迷惑了,那scanf怎么能和-1相比较呢?

其实scanf函数返回值实际读到数据的个数。例如我们输入4,那我们的scanf函数读到的数据个数就是1,1不等于-1,进入while循环。

参考scanf函数详解

我们不论在scanf函数中输入什么,要让读到数据的个数永远都不可能等于-1(即让scanf读取正常),这样循环就不停止,就可以多组输入。以下面写法也是正确的。

while(scanf("%d",%i) == 1)

如果输入正常,则scan返回值为输入数据的个数(>=1的值),所以while循环条件为真,执行循环。

直到scanf输入为假(Ctrl+Z或者输入类型不匹配的数据类型),则返回值为-1或者0。因为scanf返回值不等于1,所以while循环条件为假,不再执行循环。


EOF搭配while的实际应用场景2

#define_CRT_SECURE_NO_WARNINGS 1#includeint main() {int ch;while ((ch = getchar()) != EOF) putchar(ch);}

从上面代码和运行结果可以看出,EOF搭配while可以控制 字符串输入个数。

当然用法不止这些,需要自己去探索


补充

当系统在检测缓冲区中是否含有流结束标志时,有两种检测方式:阻塞式和非阻塞式

1.阻塞式:指的是只有在回车键按下之后,才会对缓冲区中是否含有ctrl+z组合键进行检查。需要注意的是,当缓冲区中含有可读数据时,ctrl+z就不是结束标志。我们需要明白,ctrl+z产生的并不是一个普通的ASCⅡ码值,也就是说它不会跟其他从键盘上输入的字符一样,它是不能够存放在输入缓冲区中的。

2.非阻塞时:指的是一旦按下ctrl+d之后立即响应。

如果之前没有输入字符,那么ctrl+d就是流结束标志。

如果之前已经输入了字符,那么ctrl+d此时就相当于回车不再是流结束标志,并且具有回车的功能(将输入字符送入缓冲区),并且这个回车自己也会进入缓冲区!!!

当然了windows系统一般采用阻塞式检查(ctrl+z),linux系统一般采用非阻塞式检查(ctrl+d)


后言

本篇作为本人刚开始学习以来第一篇技术性博客,可能存在没解释通、漏解释、或者解释错误的地方。希望各位可以在评论区指出我的问题,如果可以得到您的解决方案,我将不胜感激。