目录在C99标准(或C2011标准)中不存在。因此,根据定义,
fopen-ing目录是实现特定的行为或未定义的行为。
fopen(3)可能会失败(给出
NULL结果)。fseek(3)也可能失败(返回-1)。然后您最好检查errno(3)或使用perror(3)
ftell是记录在案,以返回
long,和
-1L失败。在64位Linux上,这是
0xffffffffffffffff。
您的代码应改为
FILE* fd = fopen(argv[1], "rb");if (!fd) { perror(argv[1]); exit(EXIT_FAILURE); };if (fseek(fd, 0, SEEK_END)<0) { perror("fseek"); exit(EXIT_FAILURE); };long flen = ftell(fd);if (flen == -1L) { perror("ftell"); exit(EXIT_FAILURE); };顺便说一句,在具有libc-2.17和3.10.6内核的Linux / Debian / Sid / AMD64上,当
argv[1]is
时,代码可以正常运行
/tmp;惊喜地,
flen是
LONG_MAX即
0x7fffffffffffffff
顺便说一句,在Linux上,目录是文件的特例。在文件路径上(以及在文件描述符(可能是通过some从fileno(3)获取)上)使用stat(2)来了解有关某个文件的更多元数据,包括其“类型”(通过其模式)。您希望opendir(3),readdir(3)和closedir(3)对目录内容进行操作。另请参见inode(7)。
fstat
FILE*



