如果 fgetc 读取 0xFF 会发生什么?
What will happen if fgetc reads 0xFF?
fgetc
一次从文件中读取一个字符,returns 字符类型为 int
。如果文件结束,则 fgetc
returns EOF
("probably" (int)(-1)
)。但是,我经常看到这个:
char ch;
while ((ch = fgetc(fp)) != EOF) { /* Do something. */ }
|<-- PARN -->|
这是我关心的:
fgetc
读作 OxFF
和 returns 0x000000FF
.
0xFF
分配给 ch
。 (从 int
到 char
的类型转换)
- 如果
PARN
是char
的类型,那么它将被提升为0xFFFFFFFF
。
- 由于
PARN == EOF
,中断了 while 循环。 (停止读取文件)
我们如何区分阅读 OxFF
和返回 EOF
?
fgetc
的 return 类型是 int
的全部原因是因为它可以 return 一个 unsigned char
的值,或者 EOF
。这在规范和学习 C 的任何好的资源中都有明确记录。如果您使用 char
类型的对象来存储结果,这是程序员错误。
是的,您的担心是正确的,即在进行比较之前,值被类型转换为 char。
最简单的解决方案是:
int chread;
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ }
fgetc()
returns成功获得的角色或EOF
失败。
如果失败是由文件结束条件引起的,则在流上额外设置 eof
指示符(参见 feof()) on stream. If the failure has been caused by some other error, sets the error indicator (seeferror() )。
fgetc
一次从文件中读取一个字符,returns 字符类型为 int
。如果文件结束,则 fgetc
returns EOF
("probably" (int)(-1)
)。但是,我经常看到这个:
char ch;
while ((ch = fgetc(fp)) != EOF) { /* Do something. */ }
|<-- PARN -->|
这是我关心的:
fgetc
读作OxFF
和 returns0x000000FF
.0xFF
分配给ch
。 (从int
到char
的类型转换)- 如果
PARN
是char
的类型,那么它将被提升为0xFFFFFFFF
。 - 由于
PARN == EOF
,中断了 while 循环。 (停止读取文件)
我们如何区分阅读 OxFF
和返回 EOF
?
fgetc
的 return 类型是 int
的全部原因是因为它可以 return 一个 unsigned char
的值,或者 EOF
。这在规范和学习 C 的任何好的资源中都有明确记录。如果您使用 char
类型的对象来存储结果,这是程序员错误。
是的,您的担心是正确的,即在进行比较之前,值被类型转换为 char。
最简单的解决方案是:
int chread;
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ }
fgetc()
returns成功获得的角色或EOF
失败。
如果失败是由文件结束条件引起的,则在流上额外设置 eof
指示符(参见 feof()) on stream. If the failure has been caused by some other error, sets the error indicator (seeferror() )。