用C代码表示EOF?

换行符在C代码中用"\n"表示。 是否有文件结束(EOF)字符的等价物?

EOF不是一个角色(在大多数现代操作系统中)。 它只是在到达流末尾时应用于文件流的条件。 之所以产生混淆是因为用户可以通过键入特殊字符(例如Unix,Linux 等中的 Control-D)来向控制台输入发送 EOF 信号 ,但是正在运行的程序看不到该字符,它被操作系统捕获。反过来向进程发出EOF信号。

注意:在一些非常旧的操作系统中,EOF 一个字符,例如CP / M中的Control-Z,但这是一个粗略的黑客,以避免在文件系统目录中维护实际文件长度的开销。

不.EOF不是字符,而是文件句柄的状态。

虽然ASCII字符集中有控制字符表示数据的结尾,但这些字符通常不用于表示文件的结尾。 例如EOT (^ D)在某些情况下几乎发出相同的信号。

当标准C库使用有符号整数返回字符并使用-1作为文件结尾时,这实际上只是指示的信号而不是发生错误。 我没有C标准,但引用SUSv3:

如果设置了流的文件结束指示符,或者流是在文件结尾,则应设置流的文件结束指示符,并且fgetc()将返回EOF。 如果发生读错误,则应设置流的错误指示符,fgetc()应返回EOF,并设置errno以指示错误。

EOF不是一个角色。 它不能是:(二进制)文件可以包含任何字符。 假设你有一个不断增加的字节的文件,0 1 2 3 … 255和0 1 … 255,总共512字节。 无论您认为EOF为256个可能字节中的哪一个,该文件都将被缩短。

这就是getchar()等人的原因。 返回一个int 。 可能返回值的范围是char可以具有的值,加上真正的intEOF (在stdio.h定义)。 这也是为什么检查EOF 之前将返回值转换为char不起作用的原因。

请注意,某些协议具有“EOF”“字符”。 ASCII具有“文本结束”,“传输结束”,“传输块结束”和“中等结束”。 其他答案都提到了旧的操作系统。 我自己在Linux上输入^ D,在Windows控制台上输入^ Z以停止提供程序输入。 (但是通过管道读取的文件可以在任何地方都有^ D和^ Z字符,并且当它们用完字节时只发出EOF信号。)C字符串以'\0'字符终止,但这也意味着它们不能包含字符'\0' 。 这就是为什么所有C非字符串数据函数都使用char数组(包含数据)和size_t (知道数据结束的位置)的原因。

编辑:C99标准§7.19.1.3规定:

宏是[…]
EOF
它扩展为一个整数常量表达式,类型为int ,负值,由几个函数返回,表示文件结束 ,即不再有来自流的输入;

我已经阅读了所有评论。 有趣的是要注意打印出来时会发生什么:

 printf("\nInteger = %d\n", EOF); //OUTPUT = -1 printf("Decimal = %d\n", EOF); //OUTPUT = -1 printf("Octal = %o\n", EOF); //OUTPUT = 37777777777 printf("Hexadecimal = %x\n", EOF); //OUTPUT = ffffffff printf("Double and float = %f\n", EOF); //OUTPUT = 0.000000 printf("Long double = %Lf\n", EOF); //OUTPUT = 0.000000 printf("Character = %c\n", EOF); //OUTPUT = nothing 

正如我们在这里看到的,EOF不是一个角色(无论如何)。

Windows上的命令解释程序识别的EOF字符(以及MSDOS和CP / M)是0x1a(十进制26,又名Ctrl + Z又称SUB)

例如,它仍然可以用于标记二进制文件中人类可读标头的结尾:如果文件以“Some description \ x1a”开头,则用户可以使用TYPE命令将文件内容转储到控制台,转储将停止在EOF 字符处 ,即打印一些描述并停止,而不是继续使用后面的垃圾。

EOF的值不能与任何真实角色混淆。

如果a= getchar() ,那么我们必须声明a足够大的值来保存getchar()返回的任何值。 我们不能使用char因为除了字符之外必须足够大以保持EOF。

答案是否定的,但……

你可能会因为fgets()的行为而感到困惑

来自http://www.cplusplus.com/reference/cstdio/fgets/ :

从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾 ,以先发生者为准。

这取决于系统,但通常为-1。 看到这里

在stdio.h中有一个int类型的常量EOF 。 任何标准都没有指定等效的字符文字。

我认为它可能因系统而异,但一种检查方法是使用printf

 #include  int main(void) { printf("%d", EOF); return 0; } 

我在Windows上执行了此操作,并将-1打印到控制台。 希望这可以帮助。