首页 文章

C中的文件结束(EOF)

提问于
浏览
50

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

首先,我想知道为什么EOF的值为-1,为什么 getchar()!=EOF 的值为0.请原谅我的问题,但我真的不喜欢't understand. I really tried but I can' .

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

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

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

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

3 回答

  • 67

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

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

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

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

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

  • 13

    EOF是-1,因为's how it'已定义 . 该名称由 #include 标准库头提供 . 它们使它等于-1,因为它必须是不能被 getchar() 读取的实际字节错误的东西 . getchar() 使用正数(0到255(含))报告实际字节的值,因此-1可以正常工作 .

    != 运算符表示"not equal" . 0表示错误,其他任何表示都是真的 . 所以会发生什么,我们称之为 getchar() 函数,并将结果与-1(EOF)进行比较 . 如果结果不等于EOF,则结果为真,因为不相等的事物不相等 . 如果结果等于EOF,则结果为false,因为相等的事物不是(不相等) .

    当您到达"end of file"时,对 getchar() 的调用将返回EOF . 就C而言,'standard input'(通过在命令窗口中输入您给程序的数据)就像一个文件 . 当然,您总是可以输入更多内容,因此您需要一种明确的方式来说出"I'm done" . 在Windows系统上,这是control-Z . 在Unix系统上,这是control-D .

    书中的例子不是"wrong" . 这取决于 what you actually want to do . 阅读直到EOF意味着你阅读所有内容,直到用户说"I'm done",然后你可以't read any more. Reading until ' \ n ' means that you read a line of input. Reading until ' \ 0'是一个坏主意,如果你希望用户输入输入,因为它很难或不可能产生这个命令提示符下带键盘的字节:)

  • 6

    那是很多问题 .

    • 为什么 EOF 是-1:在POSIX系统调用中通常为-1会在出错时返回,所以我想这个想法是"EOF is kind of error"

    • 任何布尔运算(包括!=)如果's TRUE, and 0 in case it'为FALSE则返回1,所以 getchar() != EOF0 ,当它为FALSE时,意味着 getchar() 返回 EOF .

    • 为了在从 stdin 读取时模拟 EOF 按Ctrl D.

相关问题