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