海牛1010KG 发表于 2025-5-26 18:12:53

鱼C课程第二节课的C语言写的代码行计算程序不出计算结果,仅输出计算中。

https://fishc.com.cn/thread-66283-1-1.html

FishC 发表于 2025-5-26 18:13:55

关于代码行统计程序无法输出结果的问题分析

根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因及解决方法如下:


[*]文件路径问题:未正确打开文件,建议:

FILE *fp = fopen("你的文件路径", "r");
if (fp == NULL) {
    printf("无法打开文件!\n");
    return 1; // 增加错误处理
}


[*]未处理空文件:文件可能为空,添加判断:

fseek(fp, 0, SEEK_END);
if (ftell(fp) == 0) {
    printf("空文件!\n");
    return 1;
}
rewind(fp); // 重置文件指针


[*]死循环问题:检查 while(!feof(fp)) 循环是否未正确读取内容,建议改用:

char buffer;
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    // 处理每一行
}


[*]未刷新输出缓冲区:在长时间操作前添加:

printf("计算中...");
fflush(stdout); // 强制刷新输出缓冲区



建议调试步骤
1. 添加文件存在性检查
2. 在循环内增加临时打印(如当前处理行号)
3. 检查是否卡在特定文件(如超大文件需要优化处理逻辑)

完整调试示例:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int isCodeLine(char *line) {
    // 实现你的空行/注释判断逻辑
}

int main() {
    FILE *fp = fopen("test.c", "r");
    if (!fp) {
      printf("错误:文件打开失败!\n");
      return 1;
    }

    int count = 0;
    char line;
    printf("计算中...");
    fflush(stdout);

    while (fgets(line, sizeof(line), fp)) {
      printf("正在处理:%s", line); // 调试输出
      if (isCodeLine(line)) {
            count++;
      }
    }

    printf("\n有效代码行数:%d\n", count);
    fclose(fp);
    return 0;
}


请特别注意:isCodeLine() 函数的实现是否正确处理以下情况:

[*]空行(只有空格/换行)
[*]单行注释(//)
[*]多行注释(/* ... */)


需要具体代码实现可提供你的判断函数,我会继续帮忙分析!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2025-5-26 18:52:52

遇到问题了吗?

海牛1010KG 发表于 2025-5-26 18:55:17

FishC 发表于 2025-5-26 18:13
关于代码行统计程序无法输出结果的问题分析

根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因 ...

void findALLFiles(const char *path);
说是没有定义这个

海牛1010KG 发表于 2025-5-26 18:57:45

不二如是 发表于 2025-5-26 18:52
遇到问题了吗?

C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码发现void findALLFiles(const char *path);这行没有定义,如何解决呢?

不二如是 发表于 2025-5-26 19:27:25

本帖最后由 不二如是 于 2025-5-26 19:29 编辑

海牛1010KG 发表于 2025-5-26 18:57
C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码 ...

假设代码没错,显示未定义,首先要知道声明 ≠ 定义:只有声明、没有实现,功能就成了“空壳”。

补上 findALLFiles 的实现,或者把已有实现编入工程,程序就能从“计算中…”走到真正输出结果。

最好完整代码发来我看下哈

player-none 发表于 2025-5-26 19:44:37

帮你叫个人 @sfqxx

小甲鱼的二师兄 发表于 2025-5-26 20:28:52

海牛1010KG 发表于 2025-5-26 18:55
说是没有定义这个

将其改成 “void findALLDirs(const char *path);” 即可。

小甲鱼的二师兄 发表于 2025-5-26 20:30:03

小甲鱼的二师兄 发表于 2025-5-26 20:28
将其改成 “void findALLDirs(const char *path);” 即可。

是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改过来啦~

海牛1010KG 发表于 2025-5-27 06:43:33

小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...

老师,我修改了你说的定义名称之后还是仅仅输出“计算中...”并没有代码行数结果,以下是我修改后的源代码:
#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 findALLDirs(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,target;

    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;

    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 = ".";

    printf("计算中...\n");
   
    findAllCodes(path);
    findALLDirs(path);

    printf("目前你总共写了 %ld 行代码!\n\n", total);
    system("pause");

    return 0;
}

海牛1010KG 发表于 2025-5-27 06:46:06

小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...

或者我应该重装VScode吗?
页: [1]
查看完整版本: 鱼C课程第二节课的C语言写的代码行计算程序不出计算结果,仅输出计算中。