2017-01-31 4 views
0

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.

+0

Bitte beachten Sie auch liefern die Fehlermeldungen und einige Details über Versionen und Plattform Dies kann, indem man find_dir_content den aktuellen Standort filepathlist zurückkehren fixiert werden! – jkalden

+2

Sie 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

+0

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

Antwort

0

Wie bereits von @unwind in den Kommentaren aus:

Sie die Adresse einer lokalen Variablen zu speichern. Das wird dir undefiniertes Verhalten bringen. Sie müssen dem Pfad selbst und nicht nur dem Zeiger dynamisch Pfad zuweisen.

Die kleinste Änderung wäre die Linie zu ändern:

  filepathlist[*size] = d_path; 

zu

  filepathlist[*size] = strdup(d_path); // d_path will go out of scope - copy the string to dynamically allocated memory. 

Stellen Sie sicher, #include <string.h> den Prototyp für strdup zu bekommen.

EDIT:

Ein weiteres Problem ist, dass, wenn Sie realloc(filepathlist) die Variablen in main immer noch auf die alte Position.

char **filepathlist(...) { 
    ... 
    return filepathlist; 
} 

und in Haupt:

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

Vielen Dank und @unwind für Ihre Antworten, ich bin sicher, sie haben einen Teil des Problems behoben, aber der Fehler ist immer noch hier – halcaponey

+0

@halcaponey Ich habe einen weiteren Bugfix hinzugefügt –

+0

Es funktioniert vielen Dank – halcaponey

Verwandte Themen