根据the C standard,fgetc
返回的任何字符都会以unsigned char
值的形式返回,“转换为int
”(该引用来自C标准,说明确实存在转换)。
当sizeof (int) == 1
时,许多unsigned char
值超出范围。因此,有些unsigned char
值可能会最终转换为int
的{{1}}值(转换结果为"implementation-defined or an implementation-defined signal is raised"),这将是EOF
尽管文件实际上没有处于错误或文件结束状态,但仍返回。
我很惊讶地发现这样的实现确实存在。 TMS320C55x CCS manual文档UCHAR_MAX
的对应值为65535,INT_MAX
具有32767,fputs
和fopen
支持二进制模式...更令人惊讶的是它似乎将环境描述为完全符合的完整实现(减去信号)。
C55x C / C ++编译器完全符合ISO规范定义的ISO C标准......
编译器工具带有完整的运行时库。所有图书馆 功能符合ISO C库标准。 ...
这样的实现是否可以返回一个值,表示没有的错误,真的完全符合?这可以证明在循环的条件部分中使用feof
和ferror
是合理的(这看起来很可怕)?例如,while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
答案 0 :(得分:2)
函数fgetc()
仅在读取正确的字符时返回int
范围内的unsigned char
值,否则返回EOF
,这是类型的负值int
。
我的原始答案(我更改了它)假设有一个整数转换为int
,但事实并非如此,因为实际上函数fgetc()
已经返回了int
的值1}}。
我认为,为了符合要求,实现必须使fgetc()
返回int
范围内的非负值,除非返回EOF
。
通过这种方式,从32768到65535的值范围永远不会与TMS320C55x实现中的字符代码相关联。