我正在阅读C编程语言书,在下面给出的代码中,我不太了解如何在这里获得EOF?而且我也不能完全理解什么是EOF?是字符,整数还是条件?如果有条件,请解释。谢谢。
#include <stdio.h>
int main(int argc, char *argv[]){
int c;
while((c = getchar()) != EOF){
printf("%d", c != EOF);
putchar(c);
}
printf("\n%d\n", c != EOF);
}
答案 0 :(得分:5)
getchar
函数可以返回可以在您的系统上表示的任何可能的字符, plus 还有一个附加的,特殊的,特殊的“带外”返回值,表示存在没有更多的字符要返回。该值由符号宏标识符EOF
引用。 <stdio.h>
后面通常有一个类似
#define EOF (-1)
该值不一定为-1,但这将达到我们的目的。 (我们不必知道或关心实际值是多少,因为我们总是引用EOF
,使我们与实际值保持隔离。)
无论值EOF
有多少,都保证它与任何实际字符都不相同。因此,如果getchar
返回的值不是EOF
,则它是已读取的实际字符。但是,如果返回EOF
,则表明输入流已到达文件末尾,表明不再有字符可以读取。
因此EOF
绝对不是字符。它是一个整数,其值不同于任何char
。我不会称它为“条件”,尽管您使用类似
if(c == EOF)
或
if(c != EOF)
我想说这些表达式c == EOF
和c != EOF
是条件。
这尤其令人困惑,因为通常您可以在键盘上键入一个特殊字符来生成文件结束指示。在Windows上是control-Z;在Unix和其他系统上,它是control-D。但这并不是说EOF
在Windows系统上是control-Z,在Unix系统上是control-D。这些字符由终端驱动程序处理,并转换为指示,表明在经过另外几级处理和解释后,导致getchar
返回EOF
。但是证明EOF
不是control-Z或control-D的一种方法是观察当您使用getchar
或getc
进行读取时一个文件,即使在这种情况下,没有人在键盘上键入控制字符,您也会在文件末尾得到EOF
指示。
最后,该讨论使我们想起使用int
变量来承载getchar
返回的值的重要性。您引用的代码正确声明了
int c;
,然后使用变量c
来保存getchar
返回的值。为什么在这里使用int
?由于getchar
返回字符,并且由于c
是字符,所以声明是不是更有意义
char c;
像这样的似乎是有道理的,但这实际上是错误的。类型char
可以容纳系统可以代表的任何字符。但是请记住,getchar
可以返回任何字符值,{em> plus EOF
值。如果将getchar
的返回值分配给类型char
的变量,最终会由于无意间将EOF指示映射到实际字符值而“刮掉”了EOF指示。接下来发生的情况是,您将一个实际字符(通常是ÿ)映射到EOF
并在阅读一个字符时错误地停止了阅读,或者您将EOF
映射到了实际字符,因此从不检测它,等等。进入无限循环,而不是在文件结尾处停止。
答案 1 :(得分:2)
EOF表示文件结束。读取输入流(文件,键盘等)时,流结束时将返回EOF。 EOF通常用int -1
表示答案 2 :(得分:-1)
EOF为条件。现在让我们举个例子。 您有1个.txt文件,其中写入了50行,但是您不知道该.txt文件中有多少个字符。现在,您想将所有字符从该.txt文件打印到c语言程序中,但仍然不知道有多少个字符。为此,您必须使用EOF(平均文件末尾),这是for循环或while循环的条件。并且此循环将继续到.txt文件的最后一个字符。