用C代码表示EOF?

sta*_*tti 38 c ascii character eof

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

Pau*_*l R 67

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

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

  • 另请注意,即使在Windows中,如果在文本模式下打开,文件中的Ctrl-Z也会触发EOF条件.Microsoft非常重视与CP/M的向后兼容性. (7认同)
  • [C标准不保证EOF不是角色.](http://stackoverflow.com/a/3861506/298225) (3认同)
  • @EricPostpischil:C标准确实(间接)保证`getchar()`等的返回值是有效字符或不同代码EOF,它不是有效字符的代码._`EOF`扩展为整数常量表达式,类型为"int"和负值,由多个函数返回以指示文件结尾,即不再有来自流的输入; _'和' _fgetc`函数将[下一个]字符作为`unsigned char`转换为`int`_'.因此,在任何`sizeof(char)!= sizeof(int)`的系统中,EOF与任何`char`都不同. (3认同)
  • @MichaelBurr:你确定那是 Windows 而不是特定于编译器的 stdio 实现吗?AFAIK,Windows 甚至没有“以文本模式打开”的条件。 (2认同)
  • @vercellop:是的,命令解释器有很多 DOS 向后兼容性。但是,虽然它与 Windows 捆绑在一起,但它只是一个用户模式工具,而不是操作系统的一部分。 (2认同)

pma*_*olm 7

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

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

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

如果用于流结束文件指示符被设置,或者如果流是在结束的文件,该流结束文件指示符应被设置和龟etc()应EOF返回.如果发生读错误,则应设置流的错误指示符,fgetc()应返回EOF,并设置errno以指示错误.


aib*_*aib 6

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和负值,由几个函数返回以指示文件结束,即不再有来自流的输入;


car*_*m85 5

我已阅读所有评论。有趣的是,当您打印出以下内容时会发生什么:

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不是字符(无论如何)。