优雅地统计代码总行数

引言

当项目文件比较多时,统计代码量变成一个很麻烦的事情。
“打开Python手动计算吧。”
“正经人谁计算啊。”
“是啊。”
“你计算吗?”
“我不计算。”
“谁有时间一个一个的算?”
“下贱。”
“下贱。”

解决方案

思路:对于一个文件夹,获取里面所有文件的路径(包括子文件夹里的文件),判断文件扩展名是否是目标扩展名,如果是则读取文件的行数。

C++代码

最新版请访问https://github.com/ghb123/CodeCounter

//www.guanhaobo.cn
#include <io.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
vector<string> files; //存储文件路径
vector<string> type;  //指定扩展名

//获取路径path下所有的文件名(包括子文件夹里的),存储在files中
void getFiles(string path, vector<string> &files)
{
    //文件句柄
    long hFile = 0;
    //文件信息
    struct _finddata_t fileinfo;
    string p;
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    {
        do
        { //如果是目录,迭代之
            //如果不是,加入列表
            if ((fileinfo.attrib & _A_SUBDIR))
            {
                if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
            }
            else
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}

//获取文件行数
int getLineNum(string path)
{
    int ans = 0, first = 1;
    char ch = ' ';
    FILE *fp = fopen(path.c_str(), "r");
    if (fp == NULL)
        return 0;
    while (ch != EOF)
    {
        ch = fgetc(fp);
        if (ch == '\n')
            ans++;
    }
    return ans + 1;
}

//判断是否是目标扩展名
bool isTarget(string path)
{
    if (type.size() == 0)
        return true;
    string name = path.substr(path.find_last_of(".") + 1);
    if (find(type.begin(), type.end(), name) != type.end())
        return true;
    return false;
}

int main()
{
    string filePath;
    cout << "请输入项目文件夹的路径:";
    cin >> filePath;
    //设置扩展名
    type.push_back("java");
    //读取所有文件的路径
    getFiles(filePath, files);
    int num, ans = 0;
    for (int i = 0; i < files.size(); i++)
    {
        //如果是目标扩展名,则读取行数
        if (isTarget(files[i]))
        {
            num = getLineNum(files[i]);
            ans += num;
            cout << files[i] << "    行数:" << num << endl;
        }
    }
    cout << endl
         << "总行数:" << ans << endl;
    return 0;
}

怎么修改上面的代码

type用来存储扩展名,只要在main函数里将所有想要的扩展名添加进type里即可。

//设置扩展名
type.push_back("java");
type.push_back("xml");
type.push_back("cpp");
//读取所有文件的路径

如果不想限制扩展名,则不要向type里添加任何东西。

//设置扩展名
//读取所有文件的路径

运行测试

输入项目文件夹的路径。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部