C 如何从文件名的字符串数组中读取文件?

C 如何从文件名的字符串数组中读取文件?,c,arrays,file,unix,directory,C,Arrays,File,Unix,Directory,所以我写了一个程序来打开一个目录,获取里面的所有文件,然后读取每个文件的内容。目前,我成功地获得了字符串数组中的所有文件名。print files[]循环显示所有文件名,但用于检查频率的循环无法正确读取文件。如何成功读取文件名数组,然后扫描每个文件名的内容 //Open Directory DIR *dr = opendir(path); struct dirent *de; if(dr == NULL){ prin

所以我写了一个程序来打开一个目录,获取里面的所有文件,然后读取每个文件的内容。目前,我成功地获得了字符串数组中的所有文件名。print files[]循环显示所有文件名,但用于检查频率的循环无法正确读取文件。如何成功读取文件名数组,然后扫描每个文件名的内容

//Open Directory
        DIR *dr = opendir(path);
        struct dirent *de;
        if(dr == NULL){
                printf("Could not open directory");
                return 0 ;
        }
        const char* files[100];
        int buffer=0;
        //Read Directory Files
        while((de = readdir(dr)) != NULL){
                files[buffer] = de->d_name;
                buffer++;
        }
        for(int x = 0; x <= buffer; x++){
                printf("%s" , files[x]);
        }
        closedir(dr);
        //Check Frequency
        for(int i = 0; i <= buffer; i++){
                int ch;
                FILE *fp;
                fp = fopen(files[i], "r");
                if(fp == NULL)
                        continue;
                ch = fgetc(fp);
                while(ch != EOF){
                        ch = tolower(ch);
                        if(ch>=97 && ch<= 122){
                                alphabetfreq[ch-97]++;
                        }
                        ch = fgetc(fp);
                }
        fclose(fp);
//打开目录
DIR*dr=opendir(路径);
结构方向*de;
如果(dr==NULL){
printf(“无法打开目录”);
返回0;
}
常量字符*文件[100];
int缓冲区=0;
//读取目录文件
while((de=readdir(dr))!=NULL){
文件[buffer]=de->d_名称;
缓冲区++;
}

对于(int x=0;x程序有多处错误。但它不读取文件的主要原因是您只是将文件名传递给fopen(),因此它在当前目录中查找它们并返回空值。而且您没有仔细处理空结果。循环中的条件应该是x如果(ch>=97&&cht,则问题似乎在“检查频率”中循环您不能简单地将
de->d_name
中的指针分配给数组。
de->d_name
是一个内部变量,可能会被
readdir
重用。您应该为每个名称分配并存储名称,而不是指向
de->d_name
的指针。您可能需要查看
alphabetfreq[]
定义和许多其他内容缺失。查看发布的代码缺少对子目录的检查。发布的代码缺少对
文件名的检查。
文件名。发布的代码缺少对符号链接
文件[缓冲区]的检查=de->d_name;
与原始问题下的注释中指出的问题相同。此外,文件名的数量是硬编码的;可能有100多个文件。为什么不为每个文件名分配空间,包括读取目录的循环中的路径?您的源代码无论如何都不会释放内存。我认为是这样的可以从
de->d_name
复制指针值,因为我们只需要读取它(至少在本例中是这样)。更好的选择是创建
de
类型的指针数组,并将返回值存储在那里。
#include<stdio.h>
#include<dirent.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

int main()
{
  int alphabetfreq[100], i;
  for(i = 0; i < 100; i++){
    alphabetfreq[i] = 0;
  }
  char path[] =  "/home/path_to_directory/";
  DIR *dr = opendir(path);
       struct dirent *de;
       if(dr == NULL){
               printf("Could not open directory");
               return 0 ;
       }
       const char* files[100];
       int buffer=0;
       //Read Directory Files
       while((de = readdir(dr)) != NULL){
               files[buffer] = de->d_name;
               buffer++;
       }
       for(int x = 0; x < buffer; x++){
               printf("%s" , files[x]);
       }
       closedir(dr);
       printf("\n");
       //Check Frequency
       for(int i = 0; i < buffer; i++){
               int ch;
               FILE *fp;
               char * file = malloc(strlen(path) + strlen(files[i]) + 1);
               strcpy(file, path);
               strcat(file, files[i]);
               fp = fopen(file, "r");
               if(fp == NULL)
              {
                printf("no file %s\n", file);
                continue;
              }
               ch = fgetc(fp);
               while(ch != EOF){
                       ch = tolower(ch);
                       if(ch>=97 && ch<= 122){
                               alphabetfreq[ch-97]++;
                       }
                       ch = fgetc(fp);
               }

       fclose(fp);
     }

     for(i = 0; i < 26; i++)
     {
       printf("%c %d\n", i+97, alphabetfreq[i]);
     }
}