Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-使用递归函数将文件夹和子文件夹中的所有wav文件路径放入字符串数组中_C_File_Recursion_Directory_Subdirectory - Fatal编程技术网

C-使用递归函数将文件夹和子文件夹中的所有wav文件路径放入字符串数组中

C-使用递归函数将文件夹和子文件夹中的所有wav文件路径放入字符串数组中,c,file,recursion,directory,subdirectory,C,File,Recursion,Directory,Subdirectory,我在下面的代码中遇到了一些问题,它应该将文件夹的路径作为输入(在我的例子中是“pack”),并将文件夹或子文件夹中每个.wav文件的路径放入字符串数组中 您可以在下面看到的代码崩溃了 在向你们寻求帮助之前,我已经自己搜索过了,当试图重新定位该文件夹的第一个文件时,崩溃似乎在第二个子文件夹中追加 我正在测试的文件夹结构如下所示: pack ├── _subfolder1 | ├── wavefile1.wav | ├── wavefile2.wav | └── wavefile3.wa

我在下面的代码中遇到了一些问题,它应该将文件夹的路径作为输入(在我的例子中是“pack”),并将文件夹或子文件夹中每个.wav文件的路径放入字符串数组中

您可以在下面看到的代码崩溃了

在向你们寻求帮助之前,我已经自己搜索过了,当试图重新定位该文件夹的第一个文件时,崩溃似乎在第二个子文件夹中追加

我正在测试的文件夹结构如下所示:

pack
├── _subfolder1
|   ├── wavefile1.wav
|   ├── wavefile2.wav
|   └── wavefile3.wav
├── _subfolder2
|   └── wavefile4.wav
├── _subfolder3
|   ├── wavefile5.wav
|   └── wavefile6.wav
代码:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

void find_dir_content(char* path, char** filepathlist, int* size)
{

    DIR* d = opendir(path);
    if(d == NULL)
        return;
    struct dirent* dir;

    while((dir = readdir(d)) != NULL) 
    {
        int isdir = 0;
        DIR* tmp;
        char f_path[255]; 
        sprintf(f_path, "%s/%s", path, dir->d_name);
        if((tmp = opendir(f_path))) { 
            closedir(tmp);
            isdir = 1;
        }

        if(!isdir) {

            char *dot = strrchr(dir->d_name, '.');
            if (dot && !strcmp(dot, ".wav")){
                char** tmp = realloc(filepathlist, sizeof(char*) * ((*size)  + 1));
                if (tmp == NULL)
                {
                    return;
                }
                else
                {
                    filepathlist = tmp;
                }
                char d_path[256];
                sprintf(d_path, "%s/%s", path, dir->d_name);
                filepathlist[*size] = d_path;
                //printf("%d : %s\n", *size, filepathlist[*size]);
                (*size)++;

            }
        }
        else if(isdir && strcmp(dir->d_name, ".") != 0 &&
            strcmp(dir->d_name, "..") != 0)
        {
            char d_path[256];
            sprintf(d_path, "%s/%s", path, dir->d_name);
            //printf("%s\n", d_path);
            find_dir_content(d_path, filepathlist, size);


        }
    }
    closedir(d);

}

int main(int argc, char** argv)
{
    int sizefilepathlist = 0;
    char** filepathlist = (char**) malloc(0*sizeof(char*));
    find_dir_content("pack", filepathlist, &sizefilepathlist);
    for(int i = 0; i< sizefilepathlist; i++){
        printf("%s", filepathlist[i]);
    }

    return 0;
}
#包括
#包括
#包括
无效查找目录内容(字符*路径,字符**文件路径列表,整数*大小)
{
DIR*d=opendir(路径);
如果(d==NULL)
返回;
结构方向*dir;
而((dir=readdir(d))!=NULL)
{
int-isdir=0;
DIR*tmp;
字符f_路径[255];
sprintf(f_路径,“%s/%s”,路径,目录->d_名称);
如果((tmp=opendir(f_路径)){
closedir(tmp);
isdir=1;
}
if(!isdir){
char*dot=strrchr(dir->d_name,”);
如果(点&!strcmp(点,.wav))){
char**tmp=realloc(filepathlist,sizeof(char*)*((*size)+1));
if(tmp==NULL)
{
返回;
}
其他的
{
filepathlist=tmp;
}
字符d_路径[256];
sprintf(d_路径,“%s/%s”,路径,目录->d_名称);
filepathlist[*size]=d_路径;
//printf(“%d:%s\n”,*大小,文件路径列表[*大小];
(*大小)+;
}
}
如果(isdir&&strcmp(dir->d_name,”)=0&&
strcmp(dir->d_name,“..”!=0)
{
字符d_路径[256];
sprintf(d_路径,“%s/%s”,路径,目录->d_名称);
//printf(“%s\n”,d\u路径);
查找目录内容(d路径、文件路径列表、大小);
}
}
closedir(d);
}
int main(int argc,字符**argv)
{
int-sizefilepathlist=0;
char**filepathlist=(char**)malloc(0*sizeof(char*);
查找目录内容(“pack”、filepathlist和sizefilepathlist);
对于(int i=0;i

编辑:我在windows上,我使用带有minGW(gcc)的codelite,没有错误消息,windows只给我旧的“已停止工作”错误。

正如@unwind在评论中指出的:


您正在存储一个局部变量的地址。这将使您的行为不明确。您必须动态地为路径本身分配空间,而不仅仅是指向它的指针

最小的改变是改变线路:

            filepathlist[*size] = d_path;

确保您
#包括
,以获取
strdup
的原型

编辑:

另一个问题是,当
realloc(filepathlist)
时,
main
中的变量仍然指向旧位置。这可以通过让
find_dir_content
返回
filepathlist
的当前位置来解决:

char **filepathlist(...) {
    ...
    return filepathlist;
}
总的来说:

filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);

还请提供错误消息以及有关版本和平台的一些详细信息!您正在存储一个局部变量的地址。这将使您的行为不明确。您必须动态地为路径本身分配空间,而不仅仅是指向它的指针。如果你有
strdup()
使用它,否则重新实现它。顺便说一句,除非这是你的家庭作业,否则你可以选择“文件树漫游”,甚至使用高级语言/库
sprintf
是危险的,至少使用
snprintf
。谢谢你和@unwind为你的答案,我确信他们已经解决了部分问题,但错误仍然存在here@halcaponey我添加了另一个错误修复
filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);