fgetc
返回EOF
文件结束或错误条件。
否则,它会将读取的字符返回为unsigned char
,转换为int
。
假设CHAR_BIT == 16
和sizeof (int) == 1
,并假设读取的下一个字符的值为 0xFFFF。然后fgetc()
将返回 0xFFFF 转换为int
.
这里有点棘手。由于 0xFFFF 不能用 type 表示int
,因此转换的结果是实现定义的。但通常,结果将是 -1,这是EOF
.
所以在这样的系统上,即使它成功读取了一个字符fgetc()
也可以返回。EOF
这里没有矛盾。在文件结尾或错误时fgetc()
返回的标准保持不变。EOF
它并没有反过来说。返回EOF
并不一定意味着存在错误或文件结束条件。
您仍然可以通过调用and来确定是否fgetc()
读取实际字符。feof()
ferror()
所以这样的系统会破坏典型的输入循环:
while ((c = fgetc()) != EOF) {
...
}
但它不会(必然)不符合标准。
(参考 blagovest 的评论),C99 是否指定何时需要标准库,或者是否符合标准的实现可以实现标准库的一部分而不是全部?
“托管实现”必须支持整个标准库,包括<stdio.h>
.
“独立实施”不需要支持<stdio.h>
;只有不声明任何函数的标准头文件(<limits.h>
,<stddef.h>
等)。<stdio.h>
但是如果它选择,一个独立的实现可以提供。
通常独立的实现是针对嵌入式系统的,通常没有操作系统。
实际上,我知道的每个当前托管实现都有CHAR_BIT==8
. 这意味着在实践中,您可能可以依靠实际指示文件结束或错误的EOF
结果——但标准并不能保证这一点。fgetc()