C语言仿造系统格式显示选定文件的各项属性

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
void showMode(int mode,char *p)
{
	int flag = 0,cache = 0400,i = 0;
	p[0] = '-';
	for(i = 1;i <= 9;i++)
	{
		switch(! (mode & cache))
		{
		case 1:p[i] = '-';break;
		case 0:{
				   switch(flag)
				   {
				   case 0:p[i] = 'r';break;
				   case 1:p[i] = 'w';break;
				   case 2:p[i] = 'x';break;
				   }
			   }
		}
		switch(flag)
		{
		case 0: case 1:flag++;break;
		case 2: flag = 0;break;
		}

		cache >>= 1;
	}
	p[i] = '\0';
}

void showID(int id,char*p)
{
	char count = 0,get = 0,j=0;
	int sum = 0;
	long i=0;
	FILE* fp = fopen("/etc/passwd","r");
	if(NULL == fp)
	{
		printf("%d\n",__LINE__);
		perror("open");
		return;
	}

	if(!strcmp(p,"uid"))
	{
		while(EOF != get )
		{
			sum = 0;
			count = 0;
			while(count<2)//找到文件中uid的位置
			{
				if((get=fgetc(fp)) == ':')
					count++;
			}
			while((get=fgetc(fp)) <= '9'&& get >= '0')//字符转整型
			{
				sum = sum * 10 + (get - '0');
			}
			if(sum == id)//判断uid是否一致
			{
				while((get = fgetc(fp)) != '\n')//移动光标至需要获取的用户名字符串前
				{
					fseek(fp,0-2,SEEK_CUR);
				}
				i = 0;
				while((get=fgetc(fp)) != ':')//获取用户名字符串
				{
					p[i++] = get;
				}
				p[i] = '\0';
				return;
			}
			while((get = fgetc(fp)) != '\n' && EOF != get);

		}
	}

	else if(!strcmp(p,"gid"))
	{
		while(EOF != get)
		{
			sum = 0;
			count = 0;
			while(count<3)//找到文件中uid的位置
			{
				if((get=fgetc(fp)) == ':')
					count++;
			}
			while((get=fgetc(fp)) <= '9'&& get >= '0')//字符转整型
			{
				sum = sum * 10 + (get - '0');
			}
			if(sum == id)//判断uid是否一致
			{
				while((get = fgetc(fp)) != '\n')//移动光标至需要获取的用户名字符串前
				{
					fseek(fp,0-2,SEEK_CUR);
				}
				i = 0;
				while((get=fgetc(fp)) != ':')//获取用户名字符串
				{
					p[i++] = get;
				}
				p[i] = '\0';
				return;
			}
			while((get = fgetc(fp)) != '\n' && EOF != get);
		}
	}
	printf("no such user\n");
	return;
}
void showMon(int mon)
{
	switch(mon)
	{
	case 1 :printf("一月");break;
	case 2 :printf("二月");break;
	case 3 :printf("三月");break;
	case 4 :printf("四月");break;
	case 5 :printf("五月");break;
	case 6 :printf("六月");break;
	case 7 :printf("七月");break;
	case 8 :printf("八月");break;
	case 9 :printf("九月");break;
	case 10 :printf("十月");break;
	case 11:printf("十一月");break;
	case 12 :printf("十二月");break;
	default:printf("输入错误\n");exit(0);
	}
}
int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat(argv[1],&buf) < 0)
	{
		perror("stat");
		return 0;
	}
	
	struct tm *ti=NULL ;
		ti=localtime(&(buf.st_ctime));
	char mod[11],uid[10] = "uid",gid[10] = "gid";
	showMode(buf.st_mode,mod);
	showID(buf.st_uid,uid);
	showID(buf.st_gid,gid);
	printf("%s %lu %s %s %ld ",mod,buf.st_nlink,uid,gid,buf.st_size);
	showMon(ti->tm_mon+1);
	printf(" %d %d:%d %s\n",ti->tm_mday,ti->tm_hour,ti->tm_min,argv[1]);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值