C中的文件结束(EOF)

时间:2010-12-05 12:18:01

标签: c eof

我目前正在阅读Ritchie&撰写的C Programming Language一书。 Kernighan的。我对getchar()函数中EOF的使用感到非常困惑。

首先,我想知道为什么EOF的值为-1,为什么getchar()!=EOF的值为0.请原谅我的问题,但我真的不明白。我真的尝试过,但我做不到。

然后我尝试在书上运行可以使用下面的代码计算字符数的例子,但是即使我按下输入,我似乎永远不会离开循环所以我想知道我何时会到达EOF ?

main(){
   long nc;
   nc = 0;
   while (getchar() != EOF)
       ++nc;
   printf("%ld\n", nc);
}

然后,我在Problem with EOF in C读了同样的问题。大多数人建议不要使用EOF,而是使用终结符\ n或空终止符'\ 0',这很有意义。

这是否意味着书上的例子有另一个目的?

3 个答案:

答案 0 :(得分:76)

EOF表示“文件结束”。换行符(当您按Enter键时会发生这种情况)不是文件的结尾,它是的结尾,因此换行符不会终止此行循环。

代码没有错[*],它只是没有做你想象的那样。它读到输入的末尾,但你似乎只想读到一行的末尾。

EOF的值为-1,因为它必须与来自getchar的任何实际字符的返回值不同。因此getchar将任何字符值作为unsigned char返回,转换为int,因此将为非负数。

如果您在终端上键入内容并且想要激发文件结尾,请使用CTRL-D(unix样式系统)或CTRL-Z(Windows)。然后在读完所有输入后,getchar()将返回EOF,因此getchar() != EOF将为false,循环将终止。

[*]好吧,如果由于整数溢出导致输入超过LONG_MAX个字符,则它具有未定义的行为,但我们可以在一个简单的例子中原谅这一点。

答案 1 :(得分:16)

EOF是-1,因为它是如何定义的。该名称由您#include的标准库标题提供。它们使它等于-1,因为它必须是不能被getchar()读取的实际字节错误的东西。 getchar()使用正数(0到255(含))报告实际字节的值,因此-1可以正常工作。

!=运算符表示“不相等”。 0代表虚假,其他任何代表都是真的。所以会发生什么,我们称之为getchar()函数,并将结果与​​-1(EOF)进行比较。如果结果不等于EOF,则结果为真,因为不相等的事物不相等。如果结果等于EOF,则结果为false,因为相等的事物不是(不相等)。

当您到达“文件结尾”时,对getchar()的调用会返回EOF。就C而言,“标准输入”(通过在命令窗口中键入给您的程序的数据)就像一个文件。当然,你总是可以输入更多,所以你需要一种明确的方式来说“我已经完成了”。在Windows系统上,这是control-Z。在Unix系统上,这是control-D。

书中的例子并非“错误”。这取决于你真正想做的事情。阅读直到EOF意味着你阅读所有内容,直到用户说“我已经完成”,然后你再也看不懂了。读到'\ n'表示你读了一行输入。如果您希望用户输入输入,则读到“\ 0”是一个坏主意,因为在命令提示符处使用键盘生成此字节要么很难或不可能:)

答案 2 :(得分:7)

这是很多问题。

  1. 为什么EOF为-1:POSIX系统调用中的-1通常会出错,因此我猜这个想法是“EOF是一种错误”

  2. 任何布尔运算(包括!=)如果为TRUE则返回1,如果为FALSE则返回0,因此当getchar() != EOF为FALSE时0getchar(),这意味着EOF已退回EOF

  3. 为了在stdin阅读时模拟{{1}}按 Ctrl + D