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”为止是一个糟糕的主意,因为要在命令提示符下用键盘产生这个字节是困难的或不可能的。
这是很多问题。
-
为什么
EOF
是-1:在POSIX系统调用通常是-1返回错误,所以我想这个想法是“EOF是一种错误” -
任何布尔操作(包括!=)在TRUE时返回1,在FALSE时返回0,所以
getchar() != EOF
在FALSE时为0
,意味着getchar()
返回EOF
。 -
为了在从
stdin
读取时模拟EOF
,请按Ctrl + D