65.9K
CodeProject 正在变化。 阅读更多。
Home

代码计数器工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (12投票s)

2001年12月20日

3分钟阅读

viewsIcon

166924

downloadIcon

4579

代码计数器是一个图形界面工具,可用于计算 VC++ 项目中源代码行数、注释行数和空白行数。

Code Counter Image

引言

代码计数器是一个使用 VC++ 开发的图形界面工具,可用于计算源代码行数、注释行数和空白行数,主要用于 VC++ 项目。 对于 VC++ 项目,将解析 .dsp 文件以获取项目中的文件列表。 但是,您也可以将代码计数器用于非 VC++ 项目,例如 Java 项目或在 UNIX 等上开发的 C/C++ 项目,方法是在 .map 文本文件中提供文件列表。 代码计数器结果可以存储为 CSV/txt 格式,也可以打印。

使用工具

首先要做的是选择一个项目。 单击“选择项目”按钮时,将出现文件打开对话框,您可以在此处选择 .dsp 文件或 .map 文件。 选择项目后,可以在树复选框中进行选择,以计算所需文件中的代码行数。 代码计数的结果将显示在列表控件中,可以将其保存到 .csv 文件或 .txt 文件,也可以打印。

实现

代码计数器是使用 VC++ 6.0 开发的 MFC 应用程序。 该实现主要包括用于读取/解析 .dsp 文件以获取项目中源文件列表的类、用于允许文件选择的树形复选框以及用于检查注释的解析源文件。

读取 .dsp 文件 & 解析源文件以查找注释

CLnCountFile 类实现了这些功能。 .dsp 文件是一个文本文件,使用一些字符串操作函数读取和解析。 源文件将紧随 .dsp 文件中的特殊标记 "# Begin Source File" 之后。 如果选择 .map 文件,则不需要特殊解析,因为该文件直接包含文件列表。 在这种情况下,应提供带有其绝对路径的文件,除非 map 文件位于存储所有文件的目录中。 如果无法打开一个或多个源文件,则会显示一个错误对话框,显示无法打开进行解析的文件列表。

BOOL CLnCountFile::GetFileList(CString strMakFile)
{
    CString strTemp;
    CStdioFile makFile(strMakFile,CFile::modeRead|CFile::typeText );
    if(makFile.m_pStream==NULL)
    {
        AfxMessageBox("Can not Open Project Make file");
        return FALSE;
    }
    m_aryFiles.RemoveAll();
    m_aryErrorFiles.RemoveAll();

    //IF Generic

    if(strMakFile.Find(".map") != -1)
    {
        AddFilesToArrayForGeneric(makFile);
    }
    else
    {
        while(makFile.ReadString(strTemp)!=FALSE)
        {
            if(strTemp.Find("# Begin Source File")!=-1) 
                if(AddFilesToArray(makFile)==FALSE)
                return FALSE;
        }
    }
    m_nFileCount=m_nCurIndex;
    m_nCurIndex=0;
    return TRUE;
}
BOOL CLnCountFile::AddFilesToArray(CStdioFile &myFile)
{
    BOOL bLocalFlag=FALSE;
    CString strTemp;
    while(myFile.ReadString(strTemp)!=FALSE)
    {
        if(strTemp.Find("# Begin Source File")!=-1)
        {
            AfxMessageBox("There is some error in the Make file");
            return FALSE;
        }
        if(strTemp.Find("# End Source File")!=-1) 
        {
            bLocalFlag=TRUE;
            break;
        }
        if(strTemp.Find(".hlp")!=-1) continue;
        if(strTemp.Find(".hpj")!=-1) continue;
        if(strTemp.Find("_AFXDLL")!=-1) continue;
        if(strTemp.Find("# ADD CPP")!=-1) continue;
        if(strTemp.Find(".pch")!=-1) continue;

        if(strTemp.Find("afxcom_.h")!=-1) continue;

        if(strTemp.Find(".cpp")!=-1 || 
          strTemp.Find(".c")!=-1 || 
          strTemp.Find(".h")!=-1)
        {
            FilterFileString(strTemp);
            if(CheckFileAdded(strTemp)==FALSE)
            {
                m_aryFiles.Add(strTemp);
                m_nCurIndex++;
            }
        }
    }
    if(bLocalFlag==FALSE)
    {
        AfxMessageBox("There is some error in the Make file");
        return FALSE;
    }
    return TRUE;
}

获取文件列表后,将解析树中选择的每个文件以查找注释、空白行和源代码行。 这里将考虑 C++ 和 C 风格的注释。 此外,如果一行包含源代码以及注释,则它将被视为源代码行。

树形复选框

可以在树控件中完成文件选中/取消选中操作,以选择/取消选择要进行代码计数的文件。 CTreeCheckListBox 类通过从 CTreeCtrl 类派生自身来实现此功能。

.map 文件

对于使用 Microsoft Developer Studio 开发的 VC++ 项目,可以解析 .dsp 文件以获取项目中文件的列表。 但是,代码计数器使用 .map 文件来计算在其他环境/平台上开发的 C/C++/Java 项目中的行数。 例如:我们可以准备一个 .map 文件来计算在 UNIX 上开发的 C/C++ 项目中的行数,在使用 FTP 复制文件之后。 此文件是一个简单的文本文件,包含项目中文件的列表。 可以根据需要提供带有绝对路径的文件名。 下面给出一个示例 .map 文件。 (此示例 .map 文件适用于代码计数器项目本身。 如果 map 文件存储在源目录中,则此处不需要绝对路径。 但是,提供绝对路径不会导致任何问题。)

///////////////////////////////////////////////////////////
C:\Users\Prashanth\Projects\VC\CodeCounter\CodeCounter.cpp
C:\Users\Prashanth\Projects\VC\CodeCounter\CodeCounterDlg.cpp
C:\Users\Prashanth\Projects\VC\CodeCounter\LnCountFile.cpp
PrintInfo.cpp
SplashDlg.cpp
StdAfx.cpp
TreeCheckListBox.cpp
CodeCounter.h
CodeCounterDlg.h
LnCountFile.h
PrintInfo.h
SplashDlg.h
StdAfx.h
TreeCheckListBox.h
///////////////////////////////////////////////////////////

结论

可以在项目开发结束时使用代码计数器,以获取为项目编写的确切源代码量。 因此,这可以用作一个很好的生产力工具。 此外,通过使用此工具,可以通过将每个代码计数结果存储在外部文件中来衡量一天或一周内编写了多少代码。 代码计数器还可以衡量项目中提供了多少注释。

© . All rights reserved.