EOF,为End Of File的缩写,一般在文本的最后存在此字符表示资料结束。html
在微软的DOS和Windows中,读取数据时终端不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或序列解释为文件结束的指明;最广泛地说,它是ASCII码中的替换字符(Control-Z,代码26)。c++
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF做为文件结束标志,这种以EOF做为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。咱们知道,ASCII代码值的范围是0~127,不可能出现-1,所以能够用EOF做为文件结束标志。缓存
档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值一般为 -1,但它依系统有所不一样。巨集 EOF会在编译原始码前展开实际值给预处理器。
C语言中,EOF常被做为文件结束的标志。还有不少文件处理函数处错误后的返回值也是EOF,所以常被用来判断调用一个函数是否成功。函数
例如:spa
1 #include <stdio.h> 2 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n) != EOF) 7 { 8 9 } 10 11 return 0; 12 }
上面的程序运行时,若是不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,若是在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时中止)。
在这"scanf("%d",&n) != EOF"至关于"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1 " 。scanf的返回值由后面的参数决定code
scanf("%d%d", &a, &b);
若是a和b都被成功读入,那么scanf的返回值就是2;若是只有a被成功读入,返回值为1;若是a和b都未被成功读入,返回值为0;若是遇到错误或遇到end of file,返回值为EOF,且返回值为int型。htm
可是在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按下。blog