Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中实现unix ls-s命令?_C_Unix - Fatal编程技术网

如何在C语言中实现unix ls-s命令?

如何在C语言中实现unix ls-s命令?,c,unix,C,Unix,我必须用C语言编写一个程序,它以块的形式返回文件大小,就像ls-s命令一样。 请帮忙 我尝试使用stat()函数(st_blksize)…但无法实现它 我的代码如下所示 我是C新手,所以不知道什么是可能的解决方案。打开文件,然后stat/fstat。结构字段st_块应包含所需的信息。如果您正在处理目录,请使用opendir、readdir、closedir(posix)。。。只是开始工作的指针 编辑 添加unistd.h和sys/stat.h。然后记住,stat在成功时返回0,所以 if (st

我必须用C语言编写一个程序,它以块的形式返回文件大小,就像ls-s命令一样。 请帮忙

我尝试使用stat()函数(st_blksize)…但无法实现它

我的代码如下所示
我是C新手,所以不知道什么是可能的解决方案。

打开文件,然后stat/fstat。结构字段st_块应包含所需的信息。如果您正在处理目录,请使用opendir、readdir、closedir(posix)。。。只是开始工作的指针

编辑

添加unistd.h和sys/stat.h。然后记住,stat在成功时返回0,所以

if (stat(dirp->d_name, &buf) == 0)
您需要包括正确的标题:

#incude <sys/stat.h>
或者,如果您有C99可用,您可以使用
中的设施使用更大的尺寸:

printf("Block size = %" PRIu64 "\n", (uint64_t)buf.st_blksize);

在实践中,这是矫枉过正;本十年的数据块大小不太可能超过2 GB,因此
int
在可预见的未来可能足够。

来自Mac OS X设备上的
man 2 stat

NAME
     fstat, fstat64, lstat, lstat64, stat, stat64 -- get file status  

SYNOPSIS  
     #include <sys/stat.h>  

     int
     fstat(int fildes, struct stat *buf);
名称
fstat,fstat64,lstat,lstat64,stat,stat64--获取文件状态
提要
#包括
int
fstat(int fildes,struct stat*buf);
请注意您尚未执行的
#include
。毫无疑问,
struct stat
的实际布局是在这里定义的,这正是编译器所抱怨的


这是手册页的一个方面,初学者并不总是讨论它,但它确实非常有用:整个unixapi都记录在手册页中。哦,当你知道一个函数应该做什么但不知道它调用什么时,它并不总是最容易找到的地方,但是所有的答案都在那里。

小心,你的代码中有一个错误是
dp
指向垃圾,并且只有
argc
小于2时才会初始化,但是您仍然尝试在
while
循环中使用它,并且还尝试
closedir
它。如果使用任何参数调用应用程序,它可能会崩溃。

为了避免警告,请将行中的%d更改为%ld:printf(“%d”,buf.st_blksize)

你需要更具体一点,在问你在执行哪一部分方面有困难之前,请加上家庭作业标签,并解释你迄今为止所做的尝试,否则你的问题可能会结束。“我无法执行它”是一个对你的困境毫无帮助的解释。你在做什么,结果与你期望的有什么不同?我想
stat(“.”,&buf)
是不正确的,你更喜欢
stat(dirp->d_name,&buf)
ls
命令不打开文件,也不应该替换它。用户最初的帖子只提到了“像ls-s”,没有指定他想要一个
ls
的克隆,只是他需要“返回”的信息。如果出于任何原因他已经打开了文件,他可以使用fstat。如果你喜欢读我的话,比如:打开文件,然后fstat或者stat它。。。顺便说一句,在opendir、readdir和closedir之间,我应该放置stat,否则这里有人会认为我相信opendir readdir足以获取文件的结构stat。。。后来他发布了代码,我现在要看一看如果你依赖的是
uint64\u t
,那么你需要C99;在这种情况下,您有
unsigned long long
,带有
%llu
格式说明符,因此您最好使用它(它至少与
uint64\t
一样大)。
#incude <sys/stat.h>
printf("Block size = %d\n", (int)buf.st_blksize);
printf("Block size = %" PRIu64 "\n", (uint64_t)buf.st_blksize);
NAME
     fstat, fstat64, lstat, lstat64, stat, stat64 -- get file status  

SYNOPSIS  
     #include <sys/stat.h>  

     int
     fstat(int fildes, struct stat *buf);