Ich habe Probleme mit dem Code darunter, der den Pfad zu einem Ordner als Eingabe übernehmen sollte (in meinem Fall " pack ") und lege die Pfade zu jeder .wav-Datei, die sie im Ordner oder in Unterordnern finden kann, in ein Array von string.C - Alle wav-Dateipfade aus einem Ordner und einem Unterordner in ein Array mit einer rekursiven Funktion einfügen
Der Code, den Sie unten sehen können, stürzt ab.
Bevor Sie fragen Jungs einige Hilfe, die ich suche nach mir habe und der Absturz scheint, während im zweiten Unterordner anhängen, wenn für die erste Datei des Ordners
Die Ordnerstruktur mit teste ich realloc versuchen so geht:
pack
├── _subfolder1
| ├── wavefile1.wav
| ├── wavefile2.wav
| └── wavefile3.wav
├── _subfolder2
| └── wavefile4.wav
├── _subfolder3
| ├── wavefile5.wav
| └── wavefile6.wav
Code:
#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;
}
Edit: ich auf Fenster bin, verwende ich codelite mit mingw (gcc), und es gibt keine Fehlermeldung, Fenster gibt nur mir der alte "hat aufgehört zu arbeiten" fehler.
Bitte beachten Sie auch liefern die Fehlermeldungen und einige Details über Versionen und Plattform Dies kann, indem man
find_dir_content
den aktuellen Standortfilepathlist
zurückkehren fixiert werden! – jkaldenSie speichern die Adresse einer lokalen Variablen. Das wird dir undefiniertes Verhalten bringen. Sie müssen dem Pfad selbst und nicht nur dem Zeiger dynamisch Pfad zuweisen. Wenn Sie 'strdup()' verwenden, implementieren Sie es andernfalls erneut. – unwind
BTW, es sei denn, es sind Ihre Hausaufgaben, können Sie "Datei Baum gehen" - https://linux.die.net/man/3/ftw, oder sogar High-Level-Sprachen/Bibliotheken verwenden – Igor