C: 统计不能正确显示大文件的文件大小

问题描述 投票:0回答:1

我有一个简单的功能来打印文件大小和文件名。

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 是溢出的,但为什么呢?

c ls stat
1个回答
3
投票

lstat 正在给你正确的答案。它是 printf 这就是问题所在。使用 %'ld 而不是 %'d 要想在实践中得到足够的好处,或者你想迂回地正确,那么就用这个来代替。

printf(" %'jd", (intmax_t)fileStat.st_size);

你可能还需要 #include <stdint.h>如果你得到一个错误,即 intmax_t 不存在的。

© www.soinside.com 2019 - 2024. All rights reserved.