在 上看到一转载的文章“EOF是什么?”文章的原网址为:/blog/2011/11/eof.html其中后面有很多的回复。仔细读读,很有理会。
我也给出了自己的理解。
我任为iSayme的说法是正确的:
man fgetc如下:
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.
另外我提到K&R中提到一个相关的经典bug:
- char c;
-
while((c = fgetc(stdin)) != EOF)
- putchar(c);
这里fgetc(stdin)返回时,由unsigned char 转换到 int型,然后在赋值操作 c = fgetc(stdin) 时又由 int 转换到了char型。最后在 c 与 EOF比较时,又由 char 转换到 int型。
但是问题来了,在 c 与 EOF的比较时,可能会出现bug:
1)如果系统的char默认是signed char,那么没有问题,因为当fgetc(stdin)读到EOF时,c = 0xff, 然后在与EOF比较时,作为 signed char 的 c 转换到int: (int)c = 0xffff == EOF,可以正确的表示读取到了文件末尾的概念。
2)但是,如果系统的char默认是unsigned char,那么就有问题,因为当fgetc(stdin)读到EOF时,c = 0xff, 然后在与EOF比较时,作为 unsigned char 的 c 转换到int: (int)c = 0xff != EOF,不能正确的表示读取到了文件末尾的概念。所以导致了死循环。
给出一段验证代码:
- #include
-
int main()
-
{
- signed char sc = 0xff;
- unsigned char uc = 0xff;
-
int i = sc;
-
int j = uc;
-
int eof = -1; // END OF FILE
- printf("i = %d = 0x%x\n", i, i);
- printf("j = %d = 0x%x\n", j, j);
- printf("sc == eof: %d\n", (sc == eof));
- printf("uc == eof: %d\n", (uc == eof));
- return 0;
-
}
运行结果:
- digdeep@ubuntu:~/uulp$ ./char
-
i = -1 = 0xffffffff
-
j = 255 = 0xff
-
sc == eof: 1
-
uc == eof: 0
阅读(1083) | 评论(0) | 转发(0) |
说: