c语言,代码统计器[线程版]、盗墓者是个丑奴儿

2024-01-12 03:59

本文主要是介绍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语言,代码统计器[线程版]、盗墓者是个丑奴儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596731

相关文章

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我