现在的位置: 首页 > 综合 > 正文

统计代码的行数 c实现

2017年11月24日 ⁄ 综合 ⁄ 共 1385字 ⁄ 字号 评论关闭

做一个小项目快一个月了,今天和同学聊着聊着,同学问我写了多少行代码?

是啊,我写了多少行代码呢?

同学建议我随便在网上找一个shell脚本代码就能知道有多少行代码,为什么不用万能的

C语言去实现呢?

于是有了此文,思路很简单,大致是传入一个文件路径或者是文件名,然后我写了一个遍历函数去寻找

.c和.h文件,并得到相应的行数。

代码如下:

int read_dir(char* filename, int mode, int* pline_num)
{
	int ret = 0;
	char file[256] = {0};
	char file_path[256] = {0};
	DIR* dir = opendir(filename);
	char end_file[64] = {0};
	int n_name = 0;


	if(!dir){ 
		printf ("open dir failure\n");
		ret = -1;
		return ret;
	}
	


	struct dirent* ent = NULL;
	while( ent = readdir(dir))
	{
		if(ent->d_type == DT_DIR)
		{
			if(mode == 1)
			{
				continue;
			}
			
			if(!memcmp(ent->d_name, ".", 1)||!memcmp(ent->d_name,"..",2))
			{
				continue;
			}
			sprintf(file_path, "%s/%s", filename, ent->d_name);
			read_dir(file_path, mode, pline_num);
			memset(file_path, 0, sizeof(file_path));
			
			continue;
		}


		else
		{
			n_name = get_dot_name(ent->d_name, end_file);
			
			if( n_name == 1 && \
					(!memcmp(end_file, "c", 1) || !memcmp(end_file,"h",1)))
			{
				sprintf (file, "%s/%s", filename, ent->d_name);
				*pline_num += get_line(file);
			}


			memset(end_file, 0, sizeof(end_file));
			memset(file, 0, sizeof(file));
		}
	}
	return ret;
}

mode 为希望程序查找的模式,若mode为1则只查找当前目录下的文件,否则查找目录下的文件和文件夹

int get_line(char* filename)
{
	FILE* fp = NULL;
	int line_num = 0;
	fp = fopen(filename, "r+");
	char c = 0;

	if(fp)
	{
		while( (c = fgetc(fp)) != EOF)
		{
			if(c == '\n')
			{
				++line_num;
			}
		}
		++line_num;
	}
	fclose(fp);
	fp = NULL;

	return line_num;
}

int get_dot_name(char* filename, char* dot_name)
{
	int n_name = 0;
	char c = 0;

	while( (c=*filename++) != '.')
	{
		if(c == '\0')
		{
			return n_name;
		}
	}

	while((*dot_name++ = *filename++) != '\0')
	{
		++n_name;
	}

	return n_name;
}

以上只是获取文件行数简单功能的实现。如有更好的方法,望多多交流。

抱歉!评论已关闭.