C 中的文件结束 (EOF)

End of File (EOF) in C

提问人:newbie 提问时间:12/5/2010 最后编辑:Communitynewbie 更新时间:5/3/2017 访问量:458009

问:

我目前正在阅读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',这很有意义。

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

C eof

评论

12赞 David Gelhar 12/5/2010
你确实明白你提到的这本书是 C 语言的原作者写的,对吧?

答:

11赞 Drakosha 12/5/2010 #1

这是很多问题。

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

  2. 任何布尔运算(包括 !=)如果为 TRUE,则返回 1,如果为 FALSE,则返回 0,如果为 FALSE,则返回 0,这意味着返回 。getchar() != EOF0getchar()EOF

  3. 为了在从印刷机上阅读时进行模拟EOFstdinCtrl+D

评论

0赞 JUST MY correct OPINION 12/5/2010
布尔运算返回非零表示 true,返回表示 false。这是有区别的。
7赞 David Gelhar 12/5/2010
否,运算符被定义为返回 1。任何非零值在布尔上下文中都是“true”(例如,或条件)。if()while()
123赞 Steve Jessop 12/5/2010 #2

EOF 表示“文件结束”。换行符(按回车键时发生的情况)不是文件的末尾,而是行的末尾,因此换符不会终止此循环。

代码没有错[*],它只是没有达到你的预期。它读取到输入的末尾,但您似乎只想读取到一行的末尾。

EOF 的值为 -1,因为它必须与实际字符的任何返回值不同。因此,将任何字符值作为无符号字符返回,转换为 int,因此它将是非负数。getchargetchar

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

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

评论

0赞 newbie 12/5/2010
我现在知道问题了..这就是为什么我看不到结果的原因。这是因为我正在使用 Dev-C++ 并且它没有系统(“暂停”),所以我需要在代码末尾输入它。
6赞 Koray Tugay 5/25/2015
实际上,CTRL+D 不会引发 EOF。它只是终止您的终端,而内核又知道不能再读取字节,因此标准输入文件描述符中没有可用的数据。
0赞 phuclv 5/3/2017
@newbie函数创建一个新 shell 并运行传递给它的命令。该命令由系统 shell 执行,与编译器没有任何关系system
1赞 EsmaeelE 6/11/2017
如果你按回车键'enter','getchar()'看到它只有一个字符,你的'nc'变量增加了。
0赞 PythonDreams 12/21/2021
@KorayTugay Bash 的行为是在收到来自 control-D 的 EOF 字符时退出 shell:unix.stackexchange.com/questions/110240/...
26赞 Karl Knechtel 12/5/2010 #3

EOF 为 -1,因为它是这样定义的。该名称由您 .他们使它等于 -1,因为它必须是不能被误认为是 读取的实际字节。 使用正数(包括 0 到 255)报告实际字节的值,因此 -1 可以正常工作。#includegetchar()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 :)