我在最后一行收到“int格式,不同类型的arg(arg 4)”错误。我应该只是转换为int还是有更好的方法来处理它?</ p>
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);
答案 0 :(得分:3)
不幸的是,没有为off_t
定义的格式,它可以是任何有符号整数类型,具体取决于平台以及某些宏(如果您可以访问大于4 GiB的文件,则可以调节)。你不能依赖这个。最好的方法是使用“j”作为printf
格式的长度修饰符,并将值转换为intmax_t
。
答案 1 :(得分:0)
请尝试格式化%ld。这取决于您的平台,但通常off_t定义为long。也可以是无符号的,在这种情况下使用%lu。
答案 2 :(得分:0)
对于off_t
类型,您应该按照以下方式打印:
snprintf(buf,LINELEN,"File Size: %jd",info.st_size);
请注意格式化程序中的j
。
答案 3 :(得分:0)
st_size
的类型为off_t
,实际上是long
。
所以正确的呼叫应该是:
snprintf(buf,LINELEN,"File Size: %ld",info.st_size);
答案 4 :(得分:0)
安全,正确和可移植:在传递varargs时总是包含一个显式的强制转换,例如printf,如果你传递的东西在编译的地方可能没有相同的类型。例如,计算你认为off_t可以获得多大(长期应该至少与off_t一样大),投射到那个,并确保你的printf格式接受你现在安全地知道你将要传递的长度对于可能有所不同的类型,没有演员表的printf会遇到麻烦。