最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)

 更新時間:2014年08月05日 10:55:33   投稿:junjie  
這篇文章主要介紹了C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼,支持文件夾、多級目錄的統(tǒng)計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下

放假在家沒事,睡過懶覺,看過電影,就想起來寫個小程序。 統(tǒng)計php代碼的行數(shù),對于phper還是挺實用的。支持單個文件和目錄。下面是代碼和演示的例子!

/**
 * @date     2012-12-1
 * @author bright
 * @todo     統(tǒng)計php代碼行數(shù)
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>  
#include <sys/stat.h>
#include <ftw.h>
#define LINESIZE 300

int fn(const char *file,const struct stat *sb,int flag);
int check_file_type(const char * file_name);
void read_file(const char *file);
int is_file();
void print_error();

int error_id=0;
char *path;
const char *FTYPE=".php";
const char *flags[]={"<?","<?php"};
const char *rflags="?>";
int line_sum=0;
int file_sum=0;
int show_one_file_line=0; //是否顯示每個文件的行數(shù)

int main(int argc, char *argv[])
{
    if(argc==1){
        printf("請在命令后面添加目錄或文件名!\n");
        return 0;
    }
    if(argc==3 && strcmp(argv[2],"-p")==0){
        show_one_file_line=1;
    }
        
    path=argv[1];
    
    if(is_file(path)){
        if(check_file_type(path)){
            read_file(path);
        }
    }
    else{
        ftw(path,fn,1000);
    }
    
    if(error_id<=3){
        print_error();
    }
    printf("files: %d \ttotal: %d Lines\n",file_sum,line_sum);
    return 0;
}

void read_file(const char *file_path)
{
    char arr[LINESIZE];
    int full_code=0;
    int line_num=0;
    
    FILE *fp;
    fp=fopen(file_path,"r+");
    
    while ((fgets(arr, LINESIZE, fp)) != NULL){
        int i=sizeof(flags)/4-1;
        
        if (full_code){
            if (strstr(arr,rflags)!=0){
                full_code=0;
            }
            else{
                line_num++;
            }
        }
        else{
            for (;i>=0;i--){
                if (strstr(arr,flags[i])!=0){
                    full_code=1;
                    break;
                }
            }
        }
    }

    line_sum+=line_num;
    file_sum++;
    if(show_one_file_line)
        printf("%s\t Lines:%d\t\n",file_path,line_num);
}

int fn(const char *file,const struct stat *sb,int flag)
{
    if(flag==FTW_F){
        if(is_file()==0){
            if(check_file_type(file)){
                read_file(file);
            }
        }
    }
    
    return 0;
}


//return 0: 文件; 1:目錄
int is_file()
{
    int i=strlen(path);
    for (;i>=0;i--){
        if (path[i]=='.'){//文件
            if (access(path,F_OK)!=0){
                error_id=1;
            }
            else if (access(path,R_OK)!=0){
                error_id=2;
            }
        
            return 1;
        }
        else if (path[i]=='/'){//目錄
            if (access(path,F_OK)!=0){
                error_id=3;
            }
            return 0;
        }
    }
    return 0;
}

//文件是否為指定格式
int check_file_type(const char * file_name)
{
    char *tmp=rindex(file_name,'.');
    if(tmp==NULL){
        return 0;
    }
    if(strcmp(tmp,FTYPE)!=0){
        error_id=4;
        return 0;
    }
    return 1;
}

//打印錯誤信息
void print_error()
{
    switch(error_id){
    case 1:
        printf("該文件不存在!請檢查!\n");
    break;
    case 2:
        printf("您沒有對該文件的讀權(quán)限!請檢查!\n");
    break;
    case 3:
        printf("該目錄不存在!請檢查!\n");
    break;
    case 4:
        printf("文件格式格式錯誤,不是%s格式,請重試!\n",FTYPE);
    break;
    }
}

演示例子:

相關文章

  • C++實現(xiàn)封裝的順序表的操作與實踐

    C++實現(xiàn)封裝的順序表的操作與實踐

    在程序設計中,順序表是一種常見的線性數(shù)據(jù)結(jié)構(gòu),通常用于存儲具有固定順序的元素,與鏈表不同,順序表中的元素是連續(xù)存儲的,因此訪問速度較快,但插入和刪除操作的效率可能較低,本文將詳細介紹如何用 C++ 語言實現(xiàn)一個封裝的順序表類,深入探討順序表的核心操作
    2025-02-02
  • 關于C++內(nèi)存中字節(jié)對齊問題的詳細介紹

    關于C++內(nèi)存中字節(jié)對齊問題的詳細介紹

    本篇文章是對C++內(nèi)存中字節(jié)對齊的問題進行了詳細的分析與總結(jié)。需要的朋友參考下
    2013-05-05
  • MFC自定義消息的實現(xiàn)方法

    MFC自定義消息的實現(xiàn)方法

    這篇文章主要介紹了MFC自定義消息的實現(xiàn)方法,通過該示例可以更好的理解MFC的消息封裝機制,以便更加靈活的打造個性化的windows應用程序,需要的朋友可以參考下
    2014-07-07
  • C語言錯誤信息報告strerror函數(shù)和perror函數(shù)詳解

    C語言錯誤信息報告strerror函數(shù)和perror函數(shù)詳解

    這篇文章主要介紹了C語言錯誤信息報告strerror函數(shù)和perror函數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • C++內(nèi)存對象布局小測試

    C++內(nèi)存對象布局小測試

    這篇文章主要介紹了C++內(nèi)存對象布局小測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • C++實現(xiàn)二維圖形的打印

    C++實現(xiàn)二維圖形的打印

    大家好,本篇文章主要講的是C++實現(xiàn)二維圖形的打印,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 關于C++類的成員初始化列表的相關問題

    關于C++類的成員初始化列表的相關問題

    下面小編就為大家?guī)硪黄P于C++類的成員初始化列表的相關問題。小編覺得挺
    2016-05-05
  • OpenCV 2.4.3 C++ 平滑處理分析

    OpenCV 2.4.3 C++ 平滑處理分析

    平滑也稱模糊, 是一項簡單且使用頻率很高的圖像處理方法,本文將詳細介紹OpenCV 2.4+ C++ 平滑處理,需要了解更多的朋友可以詳細參考下
    2012-11-11
  • C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹

    C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹

    這篇文章主要介紹了C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C語言合并排序及實例代碼

    C語言合并排序及實例代碼

    本篇文章主要介紹C語言合并排序算法,這里對合并排序通過實例代碼進行了詳細講解,希望能幫助到大家學習
    2016-07-07

最新評論

泽普县| 康保县| 清涧县| 富锦市| 连山| 琼海市| 蒙阴县| 天台县| 滦平县| 哈巴河县| 长阳| 淳安县| 正定县| 体育| 黔西| 蓬安县| 亚东县| 澄城县| 开封县| 蒙阴县| 新宁县| 汪清县| 广汉市| 沙坪坝区| 海兴县| 于都县| 潼关县| 大名县| 星子县| 阳原县| 南涧| 射洪县| 祁阳县| 聂拉木县| 马鞍山市| 武功县| 双牌县| 突泉县| 嫩江县| 徐州市| 大悟县|