Pau*_*l R 67
EOF不是一个角色(在大多数现代操作系统中).它只是在到达流末尾时应用于文件流的条件.之所以产生混淆是因为用户可以通过键入特殊字符(例如Unix,Linux 等中的 Control-D)来通知控制台输入EOF ,但是正在运行的程序看不到该字符,它被操作系统捕获.反过来向进程发出EOF信号.
注意:在一些非常古老的操作系统中,EOF 是一个字符,例如CP/M中的Control-Z,但这是一个粗略的黑客,以避免在文件系统目录中维护实际文件长度的开销.
EOF不是一个角色.它不能是:(二进制)文件可以包含任何字符.假设你有一个不断增加的字节的文件,0 1 2 3 ... 255和0 1 ... 255,总共512字节.无论您认为这256个可能的字节中的哪一个EOF,该文件都将被缩短.
这就是为什么getchar()等人.回来一个int.可能的返回值的范围是char可以具有的int值,加上真实值EOF(在中定义stdio.h).这也是为什么char 在检查之前将返回值转换为a EOF将不起作用的原因.
请注意,某些协议具有"EOF""字符".ASCII具有"文本结束","传输结束","传输块结束"和"中等结束".其他答案都提到了旧的操作系统.我自己在Linux上输入^ D,在Windows控制台上输入^ Z以停止提供程序输入.(但是通过管道读取的文件可以在任何地方都有^ D和^ Z字符,并且当它们用完字节时只发出EOF信号.)C字符串以'\0'字符结束,但这也意味着它们不能包含字符'\0'.这就是为什么所有C非字符串数据函数都使用char数组(包含数据)和a 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
Run Code Online (Sandbox Code Playgroud)
正如我们在这里看到的那样,EOF不是字符(无论如何)。