繁体   English   中英

C 中的文件结尾 (EOF)

[英]End of File (EOF) in C

我目前正在阅读 Ritchie & Kernighan 所著的《C 编程语言》一书。 我对getchar()函数中 EOF 的使用感到非常困惑。

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

然后我尝试运行书中的示例,该示例可以使用下面的代码计算字符数,但似乎即使我按 Enter 也永远不会退出循环,所以我想知道什么时候才能到达 EOF?

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

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

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

EOF 表示“文件结束”。 换行符(也就是当你按回车键会发生什么)是不是一个文件的结尾,这是一个的末尾,所以换行不会终止这个循环。

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

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

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

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

EOF 是 -1,因为它是这样定义的。 该名称由您#include的标准库头文件提供。 他们使它等于 -1,因为它必须是不能被误认为是getchar()读取的实际字节的东西。 getchar()使用正数(0 到 255 包括在内getchar()报告实际字节的值,因此 -1 可以正常工作。

!=运算符的意思是“不相等”。 0 代表假,其他的都代表真。 所以发生的事情是,我们调用getchar()函数,并将结果与​​ -1 (EOF) 进行比较。 如果结果不等于 EOF,则结果为真,因为不相等的事物不相等。 如果结果等于 EOF,则结果为假,因为相等的事物不相等(不相等)。

当您到达“文件结尾”时,对getchar()的调用将返回 EOF。 就 C 而言,“标准输入”(您通过在命令窗口中键入而提供给程序的数据)就像一个文件。 当然,您总是可以输入更多内容,因此您需要一种明确的方式来说“我完成了”。 在 Windows 系统上,这是 control-Z。 在 Unix 系统上,这是 control-D。

书中的例子并没有“错”。 这取决于您实际想要做什么 阅读到 EOF 意味着你阅读了所有内容,直到用户说“我完成了”,然后你就不能再阅读了。 读到 '\\n' 意味着你读了一行输入。 如果您希望用户键入输入,则读取直到 '\\0' 是一个坏主意,因为在命令提示符下使用键盘很难或不可能生成此字节:)

这是很多问题。

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

  2. 任何布尔运算(包括 !=)在为 TRUE 的情况下返回 1,如果为 FALSE 则返回 0,因此getchar() != EOF在为 FALSE 时为0 ,这意味着getchar()返回EOF

  3. 为了在从stdin读取时模拟EOF ,请按Ctrl+D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM