提问人:newbie 提问时间:12/5/2010 最后编辑:Communitynewbie 更新时间:5/3/2017 访问量:458009
C 中的文件结束 (EOF)
End of File (EOF) in C
问:
我目前正在阅读Ritchie&Kernighan的《C编程语言》一书。我对函数中EOF的使用感到非常困惑。getchar()
首先,我想知道为什么 EOF 的值是 -1,为什么 的值是 0。请原谅我的问题,但我真的不明白。我真的试过了,但我不能。getchar()!=EOF
然后我尝试在书上运行可以使用以下代码计算字符数的示例,但似乎即使我按回车键,我也永远不会退出循环,所以我想知道我什么时候可以到达 EOF?
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
然后,我在 C 语言中的 EOF 问题中读到了同样的问题。大多数人建议不要使用 EOF,而是使用终止符 \n 或 null 终止符 '\0',这很有意义。
这是否意味着书上的例子有另一个目的?
答:
这是很多问题。
为什么是 -1:通常 POSIX 系统调用中的 -1 在错误时返回,所以我想这个想法是“EOF 是一种错误”
EOF
任何布尔运算(包括 !=)如果为 TRUE,则返回 1,如果为 FALSE,则返回 0,如果为 FALSE,则返回 0,这意味着返回 。
getchar() != EOF
0
getchar()
EOF
为了在从印刷机上阅读时进行模拟
EOF
stdin
Ctrl+D
评论
if()
while()
EOF 表示“文件结束”。换行符(按回车键时发生的情况)不是文件的末尾,而是行的末尾,因此换行符不会终止此循环。
代码没有错[*],它只是没有达到你的预期。它读取到输入的末尾,但您似乎只想读取到一行的末尾。
EOF 的值为 -1,因为它必须与实际字符的任何返回值不同。因此,将任何字符值作为无符号字符返回,转换为 int,因此它将是非负数。getchar
getchar
如果在终端上键入内容,并且想要触发文件结尾,请使用 CTRL-D(unix 样式系统)或 CTRL-Z (Windows)。然后,在读取完所有输入后,将返回 ,因此将为 false,循环将终止。getchar()
EOF
getchar() != EOF
[*] 好吧,如果由于整数溢出而输入超过 LONG_MAX 个字符,则它具有未定义的行为,但我们可能会在一个简单的示例中原谅这一点。
评论
system
EOF 为 -1,因为它是这样定义的。该名称由您 .他们使它等于 -1,因为它必须是不能被误认为是 读取的实际字节。 使用正数(包括 0 到 255)报告实际字节的值,因此 -1 可以正常工作。#include
getchar()
getchar()
运算符的意思是“不相等”。0 代表 false,其他任何代表 true。因此,我们调用函数,并将结果与 -1 (EOF) 进行比较。如果结果不等于 EOF,则结果为 true,因为不相等的事物不相等。如果结果等于 EOF,则结果为 false,因为相等的事物不是(不相等的)。!=
getchar()
The call to returns EOF when you reach the "end of file". As far as C is concerned, the 'standard input' (the data you are giving to your program by typing in the command window) is just like a file. Of course, you can always type more, so you need an explicit way to say "I'm done". On Windows systems, this is control-Z. On Unix systems, this is control-D.getchar()
The example in the book is not "wrong". It depends on what you actually want to do. Reading until EOF means that you read everything, until the user says "I'm done", and then you can't read any more. Reading until '\n' means that you read a line of input. Reading until '\0' is a bad idea if you expect the user to type the input, because it is either hard or impossible to produce this byte with a keyboard at the command prompt :)
评论