我有一个简单的功能来打印文件大小和文件名。
void *mystat(void *filename) {
struct stat fileStat;
if (lstat(filename,&fileStat) < 0) {
fprintf(stderr, "no such file or directory: %s\n", filename);
return NULL;
}
printf(" %'d",fileStat.st_size);
printf(" %s\n", filename);
}
它对小文件很好用,但当文件很大(几GB)时,它打印的是大小 0
.
为什么这对大文件不起作用?
编辑
其实它只打印文件大小 0
当文件大小为 4GB
. 在其他情况下,当文件很大但不是多个时,它打印负数。
但是,当我捕捉到 lstat
并打印出来,它是 0
:
ret = lstat(filename,&fileStat)
我正在64位系统上编译和运行我的代码。
显然, fileStat.st_size
是溢出的,但为什么呢?
lstat
正在给你正确的答案。它是 printf
这就是问题所在。使用 %'ld
而不是 %'d
要想在实践中得到足够的好处,或者你想迂回地正确,那么就用这个来代替。
printf(" %'jd", (intmax_t)fileStat.st_size);
你可能还需要 #include <stdint.h>
如果你得到一个错误,即 intmax_t
不存在的。