C: статистика неправильно показывает размер файла для больших файлов - PullRequest
1 голос
/ 27 апреля 2020

У меня есть простая функция для печати размера файла и имени файла:

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);
}

он отлично работает для небольших файлов, но когда файл большой (пара ГБ), он печатает размер 0.

Почему это не работает для больших файлов?

EDIT

На самом деле он печатает только размер файла 0, если размер файла кратен 4GB. В другом случае, когда файл большой, но не кратный, он печатает отрицательное число.

, но когда я фиксирую код возврата lstat и печатаю его, это 0:

ret = lstat(filename,&fileStat)

Я компилирую и запускаю свой код в 64-битной системе.

Очевидно, fileStat.st_size переполнен, но почему?

1 Ответ

3 голосов
/ 27 апреля 2020

lstat дает вам правильный ответ. Это printf вот в чем проблема. Используйте %'ld вместо %'d, чтобы быть достаточно хорошим на практике, или если вы хотите быть педантично правильным, тогда сделайте это вместо:

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

Вам также может понадобиться #include <stdint.h>, если вы получить сообщение об ошибке intmax_t не существует.

...