IO day4 作业和思维导图

这篇文章展示了如何用C语言编写一个程序,通过`stat`函数遍历指定路径下的文件和目录,输出文件类型、权限模式、链接数、所有者、组、大小以及访问时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <math.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <IOhead.h>
void getmission(mode_t m)
{
    for(int i=9;i>=1;i--)
    {   if(0 != (m & (int)pow(2,i-1)))
        {    
            if(i%3==0)
                putchar('r');
            else if(i%3==2)
                putchar('w');
            else
                putchar('x');
        }
        else
            putchar('-');
    }
    return;
}
void getfiletype(mode_t m)
{
    switch(m &     S_IFMT)
    {
    case S_IFSOCK:putchar('s');break;
    case S_IFLNK :putchar('l');break;
    case S_IFREG:putchar('-');break;
    case S_IFBLK:putchar('b');break;
    case S_IFDIR:putchar('d');break;
    case S_IFCHR:putchar('c');break;
    }
    return;
}
void output(struct stat buf)
{
    getfiletype(buf.st_mode);
    getmission(buf.st_mode);
    printf(" %ld",buf.st_nlink);
    struct passwd *pwd=getpwuid(buf.st_uid);
    printf(" %s",pwd->pw_name);
    struct group *grp = getgrgid(buf.st_gid);
    printf(" %s",grp->gr_name);
    printf(" %ld",buf.st_size);
    struct tm *t=localtime(&buf.st_atime);
    printf(" %d月   %d %d:%d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
    printf("\n");
}
int main(int argc, const char *argv[])
{
    char str[128]="";
    printf("请输入文件路径名:(如../day3  ./1.c)");
    scanf("%s",str);
    struct stat buf;
    if(stat(str,&buf)<0)
    {   ERR_MSG("stat");
        return -1;
    }
    if(S_ISDIR(buf.st_mode))
    {
        DIR *dp=opendir(str);
        if (NULL == dp)
        {   ERR_MSG("opendir");
            return -1;
        }
        while(1)
        {
            struct dirent *dr=readdir(dp);
            if(NULL == dr)
            {   if(0 == errno)
                {   printf("文件读取完毕\n");
                    break;
                }
                else
                {   ERR_MSG("readdir");
                    return -1;
                }
            }
            struct stat nod;
            char ss[128];
            strcpy(ss,str);
            strcat(ss,"/");
            strcat(ss,dr->d_name);
            int k=stat(ss,&nod);
             if(k<0)
            {   ERR_MSG("stat");
                return -1;
            }
            output(nod);
        }
    }
    else
        output(buf);
    return 0;
}

实验结果和代码:

 

 

 思维导图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值