做一个小项目快一个月了,今天和同学聊着聊着,同学问我写了多少行代码?
是啊,我写了多少行代码呢?
同学建议我随便在网上找一个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;
}
以上只是获取文件行数简单功能的实现。如有更好的方法,望多多交流。