我有一个打开文件并检查其长度的程序.
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);
}
Run Code Online (Sandbox Code Playgroud)
现在,至少在Linux下,fopen()在打开目录时返回有效的文件描述符.这导致查找操作返回-1(或者,如64位系统上的size_t无符号,0xFFFFFFFFFFFFFFFF= 2 64 -1).
不幸的是,上面的代码(flen == ((size_t)-1))中的条件没有捕获到这种情况,也没有flen == 0xFFFFFFFF(编辑:应该0xFFFFFFFFFFFFFFFF).printf()- 使用%xord %d作为格式字符串的命令显示比较的两侧应具有相同的值.
为什么比较运算符的行为方式如此奇怪,即使双方的类型相同(size_t)?我使用gcc 4.8.1作为编译器.