0

我在最后一行收到“int 格式,不同类型的 arg (arg 4)”错误。我应该只转换为 int 还是有更好的方法来处理这个?

struct stat info;
if (stat(file_path, &info) == -1 || errno == ENOENT)
    return -1;

if (stat(file_path, &info) != -1)
{
    char buf[LINELEN];
    snprintf(buf,LINELEN,"File Size: %d",info.st_size);
4

5 回答 5

3

Unfortunately there is no format defined for off_t which may be any signed integer type, depending on the platform and also on some macros (that regulate if you may access files larger than 4 GiB, e.g.). You can't rely on anything of this. The best is to use "j" as a length modifier in your printf format and to cast your value to intmax_t.

于 2012-05-05T09:48:31.967 回答
0

请改用 %ld 格式。这取决于您的平台,但通常将 off_t 定义为 long。也可以是无符号的,在这种情况下使用 %lu。

于 2012-05-05T09:38:03.817 回答
0

对于off_t类型,您应该像这样打印它:

snprintf(buf,LINELEN,"File Size: %jd",info.st_size);

注意j格式化程序中的 。

于 2012-05-05T09:38:55.533 回答
0

st_size是类型的off_t,这真的是一个long

所以正确的调用应该是:

snprintf(buf,LINELEN,"File Size: %ld",info.st_size); 
于 2012-05-05T09:41:09.743 回答
0

为了安全、正确和可移植:在传递可变参数时始终包含显式转换,例如传递给 printf,如果你传递的东西在你编译的地方可能没有相同的类型。例如,计算出你认为 off_t 可以得到多大(long 应该至少和 off_t 一样大),转换成那个,并确保你的 printf 格式接受你现在安全知道你会传入的 long . 对于可能不同的类型,没有强制转换的 printf 是在自找麻烦。

于 2012-05-05T10:19:11.370 回答