遍历文件目录尝试在 C 中计算具有特定扩展名的文件中的行数

问题描述

我正在尝试遍历文件系统树。当我遇到具有特定扩展名的文件时,我想打开该文件,然后计算文件中的行数。似乎我遇到了分段错误,我相信这是在我打开文件并尝试计算行数之后/之时。任何关于为什么这是段错误的帮助将不胜感激。

编辑: 我已经删除了旧代码,因为我修复了段错误。现在我更改了要在命令行中输入的数据。但似乎文件没有打开或没有正确计算行数,因为当我运行它时,程序将始终返回 0 行。

这是更新的代码

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

const char *get_filename_ext(const char *filename) {
    const char *dot = strrchr(filename,'.');
    if(!dot || dot == filename) return "";
    return dot + 1;
}

int printdir(char *dir,char *targetFileExt,int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
      int spaces = depth*4;
    int totalLines=0;

    if((dp = opendir(dir)) == NULL) {
        fprintf(stderr,"cannot open directory: %s\n",dir);
        return -1;
    }
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)) {
            /* Found a directory,but ignore . and .. */
            if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0){
                continue;
            }
            printf("%*s%s/\n",spaces,"",entry->d_name);
            /* Recurse at a new indent level */
            totalLines = printdir(entry->d_name,targetFileExt,depth+1);
        }
        else {
          printf("%*s%s\n",entry->d_name);

          char *currentFileExt = get_filename_ext(entry->d_name);

          if(*currentFileExt == *targetFileExt){
            //open the file for reading
            FILE *fPtr = fopen(entry->d_name,"r");

            //traverse the file
            while(!feof(fPtr)){
              //if there is a new line character
              int temp = fgetc(fPtr);
              if(temp=='\n'){
                //add a line to the total amount of lines
                totalLines++;
              }
            }

            //close the file
            fclose(fPtr);
            fPtr=NULL;
          }
        }
    }
    chdir("..");
    closedir(dp);

    return totalLines;
}

int main(int argc,char* argv[])
{
    char *topdir,pwd[2]=".";
    char *ext;
    if (argc < 2 || argc > 3)
        topdir=pwd;
    else if(argc == 2){
      topdir=argv[1];
    }
    else if(argc == 3){
      topdir=argv[1];
      ext=argv[2];
    }

    printf("Directory scan of %s\n",topdir);
    int lines = printdir(topdir,ext,0);
    printf("You have written %d lines of %s code!\n",lines,ext);

    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)