代码行数统计算法实现

来源:互联网 发布:百知尚行靠谱吗 编辑:程序博客网 时间:2024/06/06 05:46

      在以前一个小小的项目当中使用到了一个小的功能,就是对开发人员每天的编写有效代码行数进行统计,当时,主要是用在C++的项目组。当时,就写了一个统计代码有效行数的算法程序并进行了简单的封装给其它开发人员使用。实现的主要思路是:代码行数 = 总共行数 - 空白行数 - 注释行数。


程序的接口文件CodeCounter.h

#include <cstring>/*定义程序的接口,获取代码,注释,空白以及总共的行数。*/class CodeCounter{public:CodeCounter();~CodeCounter();int getCodeLineNumber();//获取代码行数int getCommentLineNumber();//获取注释行数int getBlankLineNumber();//获取空白行数int getTotalLineNumber();//获取总行数void setPathAndGetLineNumbers(const char *path);//设置要统计文件的路径并且计算统计的行数private:int codeLineNumber;//代码行数int commentLineNumber;//注释行数int blankLineNumber;//空白行数int totalLineNumber;//总行数};

对接口功能的实现文件CodeCounter.cpp 这个文件也是有效代码行数统计的核心代码。

/*对接口的功能实现:获取代码行数  getCodeLineNumber获取注释行数  getCommentLineNumber获取空白行数  getBlankLineNumber获取总行数    getTotalLineNumber设置要统计文件的路径并且计算统计的行数  setPathAndGetLineNumbers*/#include "CodeCounter.h"#include <iostream>#include <stdio.h>#define MAX_SIZE 1024#define ZERO 0char str[MAX_SIZE];CodeCounter::CodeCounter(){//初始化代码,注释,空白行,总行数都为0。codeLineNumber = 0;commentLineNumber = 0;blankLineNumber = 0;totalLineNumber = 0;}CodeCounter::~CodeCounter(){//使用系统的析构函数}/*检查文本字符当中的空白字符并且删除字符*/int CheckAndDeleteBlank(char *str){int len;len = strlen(str);int j = 0;for (int i = 0; i < len; i++){if (str[i] != ' ' && str[i] != '\t')  //去掉文本中的空白符{str[j] = str[i];j = j + 1;}}str[j] = '\0'; //补字符的结尾符if (str[0] == '\n'){return ZERO;}else{return j;}}/*检查文本行是否为注释并设置标志位flag = 0 表示不是注释的开头部分flag = 1 表示是注释的开头部分*/int CheckFlag(char *str){int flag = 0;int len = strlen(str);int i = 0;while (str[i] != '\0'){if (str[i + 1] == '\0'){break;}if (str[i] == '/' && str[i + 1] == '*'){flag++;}if (str[i] == '*' && str[i + 1] == '/'){flag = 0;}i++;}if (flag > 0){flag = 1;}return flag;}/*设置要统计文件的路径并且计算统计的行数*/void CodeCounter::setPathAndGetLineNumbers(const char *path){int result;int flag = 0;errno_t err;FILE *fp;if ((err = fopen_s(&fp ,path, "r++")) != 0)   //读取指定路径的文件{std::cout << "Thi file was not openned\n";exit(-1);}while (fgets(str, MAX_SIZE, fp)){result = CheckAndDeleteBlank(str);//去掉文本一行字符当中的空白符if (flag == 0) //开始统计行数{if (result == 0){blankLineNumber++;}if (str[0] == '/' && str[1] == '/'){commentLineNumber++;}if (str[0] == '/' && str[1] == '*'){commentLineNumber++;flag = CheckFlag(str);}if (str[0] != '/') //{flag = CheckFlag(str);}}else{commentLineNumber++;if (strstr(str, "*/") != NULL && CheckFlag(str) == 0){flag = 0;}}totalLineNumber++;}fclose(fp);  //关闭文件codeLineNumber = totalLineNumber - blankLineNumber - commentLineNumber;  //代码行数 = 总行数 - 空白行数 - 注释行数}int CodeCounter::getCodeLineNumber(){return codeLineNumber;}int CodeCounter::getBlankLineNumber(){return blankLineNumber;}int CodeCounter::getCommentLineNumber(){return commentLineNumber;}int CodeCounter::getTotalLineNumber(){return totalLineNumber;}

在主程序当中进行调用测试的代码文件 main.cpp 

#include <iostream>#include "CodeCounter.h"using namespace std;int main(void){CodeCounter *pcc = new CodeCounter();pcc->setPathAndGetLineNumbers("C:\\xiyoulele.cpp");int codeLineNum = pcc->getCodeLineNumber();int commentLineNum = pcc->getCommentLineNumber();int blankLineNum = pcc->getBlankLineNumber();int totalLineNum = pcc->getTotalLineNumber();cout << "========== 显示统计结果 ==========" << endl;cout << "代码行数:" << codeLineNum << endl << endl;cout << "注释行数:" << commentLineNum << endl << endl;cout << "空白行数:" << blankLineNum << endl << endl;cout << "总共行数:" << totalLineNum << endl << endl;return 0;}

程序当中使用的测试cpp文件内容:


程序运行的结果:




原创粉丝点击