C中的文件结尾(EOF)

我正在阅读Ritchie&Kernighan所着的“C Programming Language”一书。 而且我对getchar()函数中EOF的使用感到困惑。

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

然后我试图运行该书上的例子,可以使用下面的代码来计算字符的数量,但似乎我从来没有离开循环,即使我按下input,所以我想知道什么时候我会到达EOF?

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

然后,我在C中的EOF问题中读到了同样的问题。 大多数人build议,而不是使用EOF,使用终止符\ n或空终止符'\ 0',这是很有道理的。

这是否意味着书上的例子有其他目的?

EOF表示“文件结束”。 一个换行符(这是按Enter键时发生的)不是一个文件的结尾,而是一行的结尾,所以换行符不会终止这个循环。

代码是没有错的,它只是没有做你所期望的。 它读取到input的结尾,但是您似乎只想读取一行的结尾。

EOF的值是-1,因为它必须与来自实际字符的getchar任何返回值不同。 所以getchar返回任何字符值作为一个无符号字符,转换为int,因此将是非负的。

如果您在terminalinput并且想要引发文件结束,请使用CTRL-D(unix风格的系统)或CTRL-Z(Windows)。 然后在所有input被读取后, getchar()将返回EOF ,因此getchar() != EOF将为false,循环将终止。

如果由于整数溢出而导致input超过LONG_MAX个字符,它就会有未定义的行为,但是我们可以原谅一个简单的例子。

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

!=运算符表示“不相等”。 0代表虚假,其他代表真实。 所以会发生的是,我们调用getchar()函数,并将结果与​​-1(EOF)进行比较。 如果结果不等于EOF,那么结果是正确的,因为不相等的东西是不相等的。 如果结果等于EOF,那么结果是错误的,因为相等的东西不是(不等于)。

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

书中的例子并不是“错误的”。 这取决于你真正想要做什么 。 阅读直到EOF意味着你读了所有东西,直到用户说“我完成了”,然后你再也看不懂了。 阅读直到“\ n”意味着你读了一行input。 如果您希望用户键入input,直到“\ 0”为止是一个糟糕的主意,因为要在命令提示符下用键盘产生这个字节是困难的或不可能的。

这是很多问题。

  1. 为什么EOF是-1:在POSIX系统调用通常是-1返回错误,所以我想这个想法是“EOF是一种错误”

  2. 任何布尔操作(包括!=)在TRUE时返回1,在FALSE时返回0,所以getchar() != EOF在FALSE时为0 ,意味着getchar()返回EOF

  3. 为了在从stdin读取时模拟EOF ,请按Ctrl + D