st_size为负数但没有错误

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

这是我用来显示文件“myfile_name”大小的代码

struct stat stbuf;
if (stat("myfile_name",&stbuf)<0) {
    fprintf(stderr, "\nError : %s \nErrno : %s","stat_big file",strerror(errno));
}

printf("ST_SIZE : %ld",stbuf.st_size);
当文件大小为 2,785,017,856 字节 (2.5) 时,

st_size = -1509949440(字节)

我已经搜索了很多小时来寻找解决方案,我尝试添加这一行:

#define _FILE_OFFSET_BITS 64
但它不起作用。
errno
告诉我没有错误。显然,对于 stat 函数来说,没有溢出。在另一个问题中,答案是使用
%ld
,因为
stbuf.st_size
(
off_t
) 的类型,但它不起作用。

该代码可以完美地处理小文件。

c buffer-overflow stat errno
2个回答
1
投票

%ld
格式说明符需要一个(有符号)
long
类型的参数,但
stbuf.st_size
具有类型
off_t
off_t
没有格式说明符。相反,您需要转换为可以保存
off_t
范围内的任何值并且具有格式说明符的类型。例如:

printf("%lld\n", (long long)stbuf.st_size);

甚至更好:

printf("%jd\n", (intmax_t)stbuf.st_size);

-1
投票

“man 2 stat”给出了调用和“struct stat”定义。

它还告诉您要检查的头文件(unistd.h、sys/types.h、sys/stat.h)

所以“off_t st_size” -> 你可以找到“off_t”的定义。

看一下,然后确保您的 printf 格式说明符匹配。例如如果 'off_t' 是 'unsigned long',你可能需要 '%lu',这很容易。

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