我有一个程序可以打开一个文件并检查它的长度。
FILE* fd = fopen(argv[1], "rb");
fseek(fd, 0, SEEK_END);
size_t flen = ftell(fd);
if (flen == ((size_t)-1)) {
printf("%s is a directory.\n", argv[1]);
fclose(fd);
exit(1);
}
现在,至少在 Linux 下,fopen()
打开目录时会返回一个有效的文件描述符。这导致查找操作返回-1
(或者,在 64 位系统上size_t
,无符号0xFFFFFFFFFFFFFFFF
=2 64 -1)。
不幸的是,上面代码 ( flen == ((size_t)-1)
) 中的条件并没有捕捉到这种情况,也没有flen == 0xFFFFFFFF
(编辑:应该是0xFFFFFFFFFFFFFFFF
)。printf()
- 以%x
ord%d
作为格式字符串的命令显示比较的双方应该具有相同的值。
为什么比较运算符的行为如此奇怪,即使双方都是相同的类型(size_t
)?我使用 gcc 4.8.1 作为编译器。