本文主要是介绍c语言,代码统计器[线程版]、盗墓者是个丑奴儿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//盗墓者是个丑奴儿,原
//博主个人网站 :https://daomu.kaige123.com
//打完一波小广告,进入正题
//头文件引入
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <dirent.h>
//函数声明
int opend(const char * pathname);
int judge(char * pathname);
char * str(const char * str1,const char * str2);
void readf(const char * pathname);
DIR * dir=NULL;
int in=0; //打开参数目录,记录的目录个数
char * arr[100]={0}; //打开输出参数,对目录路径收集
//参数:pathname,作用:opendir打开pathname。判断:如果是文件,调用judge()统计代码。如果是目录,调用存储进入arr数组
int opend(const char * pathname){
dir=opendir(pathname);
if(dir==NULL)
return -1;
struct dirent * reado=NULL;
while((reado=readdir(dir))!=NULL){
char * tmps=NULL;
if(reado->d_name[0]=='.')
continue;
tmps=str(pathname,reado->d_name);
if(reado->d_type==DT_DIR){
arr[in++]=tmps;
// readf(tmps);
}else{
judge(tmps);
}
if(reado==NULL)
free(tmps);
}
}
int y=0;
pthread_mutex_t s; //互斥锁
void * run(void * arg){ //给创建线程,所绑定的方法
pthread_mutex_lock(&s); //加锁
readf(arr[y++]);
pthread_mutex_unlock(&s); //解锁,因为下面用了join阻塞回收子线程,这里也可有可无
}
//参数:pathname,作用,递归目录,如果发现递归到文件了,调用judge()统计代码。如果是目录,自调
void readf(const char * pathname){
DIR * dir=opendir(pathname);
struct dirent * reado=NULL;
while((reado=readdir(dir))!=NULL){
char * tmps=NULL;
if(reado->d_name[0]=='.')
continue;
tmps=str(pathname,reado->d_name);
if(reado->d_type==DT_DIR){
readf(tmps);
}else{
judge(tmps);
}
if(reado==NULL)
free(tmps);
}
}
//count_num统计字数
//rows统计行数
//统计的.c文件个数
int count_num=0;
int rows=0;
int gs=0;
//参数:pathname(文件路径),作用,过滤出.c文件,统计.c文件的字数,行数
//第一步,先等于"\0",去掉\。第二步,strstr过滤出.c文件。第三步,打开处理后的pathname。第四步,获得文件大小,read读取内容。第五步:过滤掉内容于10与32的,10空格,32换行。
//过滤10与32的剩余长度,就是统计出:文件有效长度。过滤掉32,就是统计出:文件的有效行数
int judge(char * pathname){
pathname[strlen(pathname)-1]='\0';
if(strstr(pathname,".c")==NULL)
return 0;
gs++;
int fd=open(pathname,O_RDWR);
int length=lseek(fd,0,SEEK_END);
close(fd);
fd=open(pathname,O_RDWR);
char ar[length];
memset(ar,'0',length);
ar[sizeof(ar)]='\0';
read(fd,ar,length);
for(int i=0;i<length;i++){
if(ar[i]!=10 && ar[i]!=32)
count_num++;
if(ar[i]==10)
rows++;
}
close(fd);
}
//参数:str1,str2。将str1yustr2拼接,加/。如/usr与a.out,返回/usr/a.out/
char * str(const char * str1,const char * str2){
int size1=strlen(str1);
int size2=strlen(str2);
char * arr=(char *)malloc(size1+size2+2);
memset(arr,'0',size1+size2);
memcpy(arr,str1,size1);
memcpy(&(arr[size1]),str2,strlen(str2));
arr[size1+size2]='/';
return arr;
}
//main接收传参,进行程序运行
int main(int arg,char ** arv){
if(arv[1]!=NULL)
opend(arv[1]);
for(int i=0;i<in;i++){
pthread_t s;
pthread_create(&s,NULL,run,NULL);
pthread_join(s,NULL);
}
pthread_mutex_destroy(&s); //回收互斥锁
printf("number=%d rows=%d gs=%d\n",count_num,rows,gs);
return 0;
}
运行结果:上面是带线程的运行,下面是不带线程的运行
这篇关于c语言,代码统计器[线程版]、盗墓者是个丑奴儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!