经过很长时间的搜索,我不得不寻求您宝贵的帮助。我正在编写一个在C中实现"ls"unix命令的程序。我只知道文件名和大小。我看起来我必须使用:"stat"one_answers"dirent"。我在Stackoverflow中找到了一个"解决方案",但对我来说并不完美。所以我可以在目录中显示文件的名称,但不能显示它们的大小。当我使用gcc时,它是否显示:0八位字节(当它不为空时)或"
错误:格式"%s"需要类型为"char*"的参数,但参数为3具有类型'__off_t'[-Weror=format=]printf("%s-%s",dp->d_name,s->strongize);
"
我的测试代码(不干净):
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <errno.h>
#include <poll.h>
struct stat statbuf;
struct dirent *dp;
struct stat *s;
int main ()
{
DIR *dirp;
dirp = opendir("/tmp/gestrep");
while((dp = readdir(dirp)) !=NULL)
{
stat(dp->d_name, &statbuf);
printf("%s - %s", dp->d_name, s->st_size);
}
}
事实上,我不知道如何解决格式类型的问题。我看到我可以使用ftell/fseek,但我无权使用FILE*函数。
感谢您提供的所有解决方案:)
您当然不能用%s
格式代码输出任何整数类型的值,并且您从gcc得到的错误消息应该非常清楚。
Posix要求off_t
是某个整数类型的别名,因此一个简单的解决方案(使用C11)是将值强制转换为intmax_t
(这是最宽的整数类型),然后使用j
printf格式大小修饰符:
printf("%s - %jd", dp->d_name, (intmax_t)s->st_size);
您需要确保为intmax_t
提供适当的标题:
#include <stdint.h>