C中的文件结束(EOF)

new*_*bie 60 c eof

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

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

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

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

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

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

Ste*_*sop 84

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

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

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

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

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

  • 实际上CTRL + D不会引发EOF.它只是终止你的终端,而内核知道不再能读取字节,所以标准输入文件中没有数据可用. (4认同)

Kar*_*tel 17

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'是一个坏主意,因为在命令提示符下用键盘生成这个字节很难或不可能:)


Dra*_*sha 7

那是很多问题.

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

  2. 任何布尔运算(包括!=)在它为TRUE时返回1,如果它getchar() != EOF0FALSE则getchar()返回0,所以当它为FALSE时返回,意味着返回EOF.

  3. 为了EOF在从stdin新闻界阅读时效仿Ctrl+D

  • 不,运算符被定义为返回1.在布尔上下文中任何非零值都是"true"(例如,`if()`或`while()`条件). (7认同)