鱼C论坛

 找回密码
 立即注册
查看: 798|回复: 5

[已解决]结果为什么不是统计代码量

[复制链接]
发表于 2023-9-10 18:07:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<io.h>
#include<direct.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 256

long total;
 
int countLines(const char *filename);
void findAllCodes(const char *path);
void findALLFiles(const char *path);

int countLines(const char *filename)
{
        FILE *fp;
        int count=0;
        int temp;
        
        if((fp=fopen(filename,"r"))==NULL)
        {
                fprintf(stderr,"Can not open the file:%s\n",filename);
                return 0;
        }
        
        while((temp=fgetc(fp))!=EOF)
        {
                if(temp=='\n')
                {
                        count++;
                }
        }
        
        fclose(fp);
        
        return count;
}
 
void findAllCodes(const char *path)
{
        struct _finddata_t fa;
        long handle;
        char thePath[MAX],target[MAX];
        
        strcpy(thePath,path);
        if((handle=_findfirst(strcat(thePath,"/*.c"),&fa)) != -1L)
        {
                do
                {
                        sprintf(target,"%s%s",path,fa.name);
                        total+=countLines(target);
                }while(_findnext(handle,&fa)==0);
        }
        
        _findclose(handle); 
}
 
 void findALLDirs(const char *path)
 {
         struct _finddata_t fa;
         long handle;
         char thePath[MAX];
         
         strcpy(thePath,path);
         if((handle=_findfirst(strcat(thePath,"/*"),&fa))==-1L)
         {
                 fprintf(stderr,"The path %s is wrong!\n",path);
                 return;
         }
         
         do
         {
                 if(!strcmp(fa.name,".")||!strcmp(fa.name,".."))
                 continue;
                 
                 if(fa.attrib==_A_SUBDIR)
                 {
                         sprintf(thePath,"%s%s",path,fa.name);
                         findAllCodes(thePath);
                         findALLDirs(thePath);
                 }
         }while(_findnext(handle,&fa)==0);
         
         _findclose(handle);
 }
 
 int main()
 {
         char path[MAX]=".";
         
         printf("计算中···\n");
         
         findAllCodes(path);
         findALLDirs(path);
         
         printf("目前你总共写了 %ld 行代码!\n\n",total);
         system("pause");
         
         return 0;
 }
最佳答案
2023-9-15 00:24:23
落单的袜子 发表于 2023-9-14 18:59
计算中···
Can not open the file:.e2代码量.c
目前你总共写了 0 行代码!

对照一下小甲鱼的代码,发现有两个错误。
分别在第51行和第79行。
你把"%s/%s"中间的斜杠符号漏了,导致查找的目录不正确。
修改后代码如下:
#include<io.h>
#include<direct.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 256

long total;
 
int countLines(const char *filename);
void findAllCodes(const char *path);
void findALLFiles(const char *path);

int countLines(const char *filename)
{
        FILE *fp;
        int count=0;
        int temp;
        
        if((fp=fopen(filename,"r"))==NULL)
        {
                fprintf(stderr,"Can not open the file:%s\n",filename);
                return 0;
        }
        
        while((temp=fgetc(fp))!=EOF)
        {
                if(temp=='\n')
                {
                        count++;
                }
        }
        
        fclose(fp);
        
        return count;
}
 
void findAllCodes(const char *path)
{
        struct _finddata_t fa;
        long handle;
        char thePath[MAX],target[MAX];
        
        strcpy(thePath,path);
        if((handle=_findfirst(strcat(thePath,"/*.c"),&fa)) != -1L)
        {
                do
                {
                        sprintf(target,"%s/%s",path,fa.name); //  sprintf(target,"%s%s",path,fa.name)
                        total+=countLines(target);
                }while(_findnext(handle,&fa)==0);
        }
        
        _findclose(handle); 
}
 
 void findALLDirs(const char *path)
 {
         struct _finddata_t fa;
         long handle;
         char thePath[MAX];
         
         strcpy(thePath,path);
         if((handle=_findfirst(strcat(thePath,"/*"),&fa))==-1L)
         {
                 fprintf(stderr,"The path %s is wrong!\n",path);
                 return;
         }
         
         do
         {
                 if(!strcmp(fa.name,".")||!strcmp(fa.name,".."))
                 continue;
                 
                 if(fa.attrib==_A_SUBDIR)
                 {
                         sprintf(thePath,"%s/%s",path,fa.name);  //  sprintf(thePath,"%s%s",path,fa.name);
                         findAllCodes(thePath);
                         findALLDirs(thePath);
                 }
         }while(_findnext(handle,&fa)==0);
         
         _findclose(handle);
 }
 
 int main()
 {
         char path[MAX]=".";
         
         printf("计算中···\n");
         
         findAllCodes(path);
         findALLDirs(path);
         
         printf("目前你总共写了 %ld 行代码!\n\n",total);
         system("pause");
         
         return 0;
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-10 18:07:57 | 显示全部楼层
该程序的功能是统计指定目录下所有以.c为后缀的文件中的代码行数,并输出总代码行数。

程序中的函数countLines用于统计单个文件中的代码行数,findAllCodes用于查找指定目录下所有以.c为后缀的文件并调用countLines函数统计代码行数,findALLDirs用于查找指定目录下所有子目录并调用findAllCodes函数统计代码行数。最终在main函数中输出总代码行数。

程序中使用了Windows系统特有的函数_findfirst和_findnext进行目录和文件的查找。程序中的变量total用于存储总代码行数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 18:08:04 | 显示全部楼层
这段代码是用来统计指定路径下所有 C/C++ 代码文件中的行数的。代码主要包括以下几个函数:

1. countLines:用于统计单个代码文件中的行数。
2. findAllCodes:递归查找指定路径下的所有代码文件,并调用 countLines 统计行数。
3. findALLDirs:递归查找指定路径下的所有子目录,并在子目录中调用 findAllCodesfindALLDirs
4. main:程序入口,通过指定路径调用 findAllCodesfindALLDirs 来统计代码行数,并输出结果。

最终会输出统计结果,即总共写了多少行代码。

请注意,这是一段简单的代码,仅用于演示如何统计代码行数,并不具备处理复杂情况的能力。如果需要更高级的代码统计功能,可以考虑使用专业的代码统计工具或库。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-12 23:43:58 | 显示全部楼层
发一下你的程序输出了什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-14 18:59:15 | 显示全部楼层
额外减小 发表于 2023-9-12 23:43
发一下你的程序输出了什么

计算中···
Can not open the file:.e2代码量.c
目前你总共写了 0 行代码!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-15 00:24:23 | 显示全部楼层    本楼为最佳答案   
落单的袜子 发表于 2023-9-14 18:59
计算中···
Can not open the file:.e2代码量.c
目前你总共写了 0 行代码!

对照一下小甲鱼的代码,发现有两个错误。
分别在第51行和第79行。
你把"%s/%s"中间的斜杠符号漏了,导致查找的目录不正确。
修改后代码如下:
#include<io.h>
#include<direct.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 256

long total;
 
int countLines(const char *filename);
void findAllCodes(const char *path);
void findALLFiles(const char *path);

int countLines(const char *filename)
{
        FILE *fp;
        int count=0;
        int temp;
        
        if((fp=fopen(filename,"r"))==NULL)
        {
                fprintf(stderr,"Can not open the file:%s\n",filename);
                return 0;
        }
        
        while((temp=fgetc(fp))!=EOF)
        {
                if(temp=='\n')
                {
                        count++;
                }
        }
        
        fclose(fp);
        
        return count;
}
 
void findAllCodes(const char *path)
{
        struct _finddata_t fa;
        long handle;
        char thePath[MAX],target[MAX];
        
        strcpy(thePath,path);
        if((handle=_findfirst(strcat(thePath,"/*.c"),&fa)) != -1L)
        {
                do
                {
                        sprintf(target,"%s/%s",path,fa.name); //  sprintf(target,"%s%s",path,fa.name)
                        total+=countLines(target);
                }while(_findnext(handle,&fa)==0);
        }
        
        _findclose(handle); 
}
 
 void findALLDirs(const char *path)
 {
         struct _finddata_t fa;
         long handle;
         char thePath[MAX];
         
         strcpy(thePath,path);
         if((handle=_findfirst(strcat(thePath,"/*"),&fa))==-1L)
         {
                 fprintf(stderr,"The path %s is wrong!\n",path);
                 return;
         }
         
         do
         {
                 if(!strcmp(fa.name,".")||!strcmp(fa.name,".."))
                 continue;
                 
                 if(fa.attrib==_A_SUBDIR)
                 {
                         sprintf(thePath,"%s/%s",path,fa.name);  //  sprintf(thePath,"%s%s",path,fa.name);
                         findAllCodes(thePath);
                         findALLDirs(thePath);
                 }
         }while(_findnext(handle,&fa)==0);
         
         _findclose(handle);
 }
 
 int main()
 {
         char path[MAX]=".";
         
         printf("计算中···\n");
         
         findAllCodes(path);
         findALLDirs(path);
         
         printf("目前你总共写了 %ld 行代码!\n\n",total);
         system("pause");
         
         return 0;
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表