以下代码中的 EOF 是什么?

What will be EOF here in the below code?

我正在阅读 C 编程语言书籍,在下面给出的代码中,我不太明白我们如何在这里获得 EOF?而且我也不完全明白什么是 EOF?它是字符、整数还是条件?如果这是一个条件,那么请解释。谢谢你。

#include <stdio.h>
int main(int argc, char *argv[]){
int c;
while((c = getchar()) != EOF){
  printf("%d", c != EOF);
  putchar(c);
}
printf("\n%d\n", c != EOF);
}

EOF表示文件结束。当您读取输入流(文件、键盘等)时,在流结束时返回 EOF。 EOF 通常由 int -1

表示

getchar 函数可以 return 任何可以在您的系统上表示的可能字符,加上 一个额外的,特殊的,"out-of-band" return 值表示没有更多字符要 returned。该值由符号宏标识符 EOF 引用。在 <stdio.h> 后面的某个地方通常有一个像

这样的定义
#define EOF (-1)

该值不一定是 -1,但这符合我们的目的。 (我们不必知道或关心实际值是多少,因为我们总是引用 EOF,使我们与实际值隔绝。)

无论 EOF 有什么值,都保证不会与任何实际字符相同。因此,如果 getchar return 是 EOF 以外的值,则它是已读取的实际字符。但是,如果它 returns EOF,则表示输入流已到达文件末尾,没有更多字符可读。

所以 EOF 绝对 不是 一个字符。它是一个整数,其值不同于任何 char。我不会将其称为 "condition",尽管您使用

之类的代码对其进行了测试
if(c == EOF)

if(c != EOF)

我会说那些表达式 c == EOFc != EOF 是条件。

这特别令人困惑,因为通常您可以在键盘上键入一个特殊字符来生成文件结束指示。在 Windows 上是 control-Z;在 Unix 和其他系统上它是 control-D。但这确实 而不是 意味着 EOF 在 Windows 系统上是 control-Z 或者在 Unix 系统上是 control-D。这些字符由终端驱动程序处理并翻译成一个指示,经过几个额外的处理和解释级别后,导致 getchar 到 return EOF。但是证明 EOF 而不是 control-Z 或 control-D 的一种方法是观察当您使用 getchargetc要从文件中读取,你会在文件末尾得到一个 EOF 指示,即使在这种情况下没有人在键盘上输入控制字符。

最后,这个讨论提醒我们使用 int 变量来承载由 getchar 编辑的值 return 的重要性。您引用的代码正确声明

int c;

然后使用变量 c 来保存由 getchar 编辑的值 return。为什么在这里使用 int?由于 getchar returns 个字符,并且由于 c 是一个字符,声明

不是更有意义吗
char c;

那个好像有道理,其实大错特错。类型 char 可以包含系统可以表示的任何字符。但请记住,getchar可以return任何字符值, EOF值。如果您将 getchar 的 return 值分配给类型 char 的变量,您最终会 "scraping off" EOF 指示,因为无意中将其映射到实际字符值。接下来发生的事情要么是您将一个实际字符(通常是 ÿ)映射到 EOF 并在阅读时错误地停止阅读,要么您将 EOF 映射到一个实际字符,因此永远不会检测到它等等进入无限循环而不是在文件末尾停止。

EOF 是条件。现在让我们举个例子。 您有 1 个 .txt 文件,其中写入了 50 行,但您不知道该 .txt 文件中有多少个字符。现在您想将该 .txt 文件中的所有字符打印到您的 C 语言程序中,但您仍然不知道那里有多少字符。为此,您必须使用 EOF(表示文件结束),这是 for 循环或 while 循环的条件。并且此循环将继续到您的 .txt 文件的最后一个字符。