统计自己Ubuntu系统中家目录下,一共敲了多少行代码。 要求:使用C语言实现

统计自己从C学习开始到现在,一共敲了多少行代码。
要求:
1.使用C语言实现

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int read_dir(char *pathname, char *filename);
int file_type(char *filename);
int get_file_line(char *filename);
int get_dir_file_line(char *filename, int lines);

int main()
{
	system("rm myfile");
	read_dir("/home/gxf/21021class","myfile");
	int ret = get_file_line("myfile");
	ret = get_dir_file_line("myfile",ret);
	printf("line:%d\n",ret);
	return 0;
}

int get_dir_file_line(char *filename, int lines)
{
	int count = 0;
	if(lines <= 0)
	{
		return -1;
	}
	if(NULL == filename)
	{
		return -1;
	}
	FILE *fp = fopen(filename,"r");
        if(NULL == fp)
	{
		return -1;
	}
	int i = 0;
	for(i = 0; i < lines; i++)
	{
		char buf[250] = {0};
        	fgets(buf,250,fp);
		int len = strlen(buf);
		buf[len-1] = 0;
        	puts(buf);
		int ret = get_file_line(buf);
		printf("ret:%d\n",ret);
		if(ret > 0)
		{
			count += ret;
		}
	}
        fclose(fp);
	return count;
}

int read_dir(char *pathname, char *filename)
{
	if(NULL == pathname || NULL == filename)
	{
		puts("pathname or filename is null pointer");
		return -1;
	}
	DIR* fdp = opendir(pathname);
	if(NULL == fdp)
	{
		puts("opendir error.");
		return -1;
	}
	puts("opendir success.");

	FILE *fp = fopen(filename,"a");
	if(NULL == fp)
	{
		puts("create file error.");
		closedir(fdp);
		return -1;
	}
	
	while(1)
	{
		char buf[250];
		int ret = 0;
		struct dirent *pd = readdir(fdp);	
		if(pd != NULL)
		{
			if(strcmp(pd->d_name,".") == 0 || strcmp(pd->d_name,"..") == 0)
			{
				continue;
			}
			switch(pd->d_type)
			{
				case DT_REG:
					//*.[ch] do it
					ret = file_type(pd->d_name);
					//printf("%s\tret:%d\n",pd->d_name, ret);
					if(ret == 1)
					{
						memset(buf, 0, sizeof(buf));
						sprintf(buf,"%s/%s\n",pathname,pd->d_name);
						//puts(buf);
						fwrite(buf,strlen(buf),1,fp);
					}
					break;
				case DT_DIR:
					memset(buf, 0, sizeof(buf));
					sprintf(buf,"%s/%s",pathname,pd->d_name);
					//puts(buf);
					read_dir(buf,filename);
					sleep(2);
					break;
			}
		}
		else
		{
			break;
		}
	}
	closedir(fdp);
	fclose(fp);
	return 0;
}

int file_type(char *filename)
{
	if(NULL == filename)
	{
		return 0;
	}

	int len = strlen(filename);
	if(filename[len-1] == 'c' || filename[len-1] == 'h')
	{
		return 1;
	}
}

int get_file_line(char *filename)
{
	int count = 0;
	if(NULL == filename)
	{
		return -1;
	}
	FILE *fp = fopen(filename,"r");
	if(NULL == fp)
	{
		puts("open file error.");
		return -1;
	}
	char buf[2];
	while(1)
	{
		memset(buf,0,sizeof(buf));
		int ret = fread(buf,1,1,fp);
		if(ret > 0)
		{
			if(buf[0] == '\n')
			{
				count++;
			}
		}
		else
		{
			break;
		}
	}
	return count;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值