【发布时间】:2019-11-27 23:21:18
【问题描述】:
所以我编写了一个程序来打开一个目录,获取里面的所有文件,然后读取每个文件的内容。目前我成功地获得了字符串数组中的所有文件名。 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);
【问题讨论】:
-
问题似乎出在“检查频率”循环中
-
您不能简单地将指针从
de->d_name分配给您的数组。de->d_name是一个内部变量,很可能被readdir重用。您应该为每个名称分配并存储名称而不是指向de->d_name -
alphabetfreq[]定义和许多其他缺失。评论minimal reproducible example -
发布的代码缺少对子目录的检查。发布的代码缺少对
.和..文件名的检查。发布的代码缺少对符号链接的检查
标签: c arrays file unix directory