如果fgetc读取0xFF会发生什么情况?
如果fgetc读取0xFF会发生什么情况?,c,casting,fgetc,C,Casting,Fgetc,fgetc一次从文件中读取一个字符,并以int类型返回该字符。如果文件结束,则fgetc返回EOF(“可能”(int)(-1))。然而,我经常看到这一点: char ch; while ((ch = fgetc(fp)) != EOF) { /* Do something. */ } |<-- PARN -->| charch; 而((ch=fgetc(fp))!=EOF){/*做点什么。*/} || 这是我所关心的: fgetc读取OxFF并返回0x0
fgetc
一次从文件中读取一个字符,并以int
类型返回该字符。如果文件结束,则fgetc
返回EOF
(“可能”(int)(-1)
)。然而,我经常看到这一点:
char ch;
while ((ch = fgetc(fp)) != EOF) { /* Do something. */ }
|<-- PARN -->|
charch;
而((ch=fgetc(fp))!=EOF){/*做点什么。*/}
||
这是我所关心的:
fgetc
读取OxFF
并返回0x000000FF
0xFF
被分配给ch
。(从int
到char
进行类型转换)PARN
是char
类型,则它将被提升为0xFFFFFFFF
PARN==EOF
。(停止从文件中读取)我们如何区分读取
OxFF
和返回EOF
之间的区别?fgetc返回类型为int
的全部原因是,它可以返回无符号字符的值,或者EOF
。规范和学习C的任何好资源中都清楚地记录了这一点。如果使用char
类型的对象存储结果,这是程序员错误。fgetc
的返回类型为int
的全部原因是,它可以返回无符号char
的值,或EOF
。这在规范和学习C的任何优秀资源中都有明确的记录。如果您使用类型为char
的对象来存储结果,这是程序员错误。是的,您担心的是,在进行比较之前,值被类型转换为char是正确的
最简单的解决方案是:
int chread;
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ }
是的,您的担心是正确的,在进行比较之前,该值会被typecast转换为char 最简单的解决方案是:
int chread;
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ }
fgetc()
在成功时返回获取的字符,或在失败时返回EOF
如果故障是由文件结束条件引起的,则在流中另外设置eof
指示器(请参阅)。如果故障是由某些其他错误引起的,请将错误指示器(请参阅)设置为启用。fgetc()
成功时返回获取的字符,或失败时返回EOF
如果故障是由文件结束条件引起的,则在流中另外设置
eof
指示器(请参阅)。如果故障是由其他错误引起的,请将错误指示器(请参阅)设置为运行状态。这就是您将ch
声明为int
而不是char
类型的原因。然后,您的代码就会崩溃。大多数情况下,人们将ch
声明为char
@KevinDong:这是错误的。不要这样做。这就是你将ch
声明为int
而不是char
类型的原因。然后你的代码爆炸了。大多数情况下,人们将ch
声明为char
@KevinDong:那是错误的。别这样,我明白了。当我在other中看到这样的代码时,我认为它是错误的,所以我在这里询问并检查它是否正确。非常感谢我得到了它。当我在other中看到这样的代码时,我认为它是错误的,所以我在这里询问并检查它是否正确。非常感谢感谢您的解决方案。;-)感谢您的解决方案。;-)