opendir(variable string) in C



  • Hallo aller Seits,

    ich habe gerade ein Problem: ich möchte ein Verzeichnis mit opendir in C unter Unix öffnen und sein Inhalt auflisten; aber opendir bekommt als Argument ein const *char; das Problem ist dass mein Verzeichnisname nicht konstant ist, sondern kann variabel sein. D.h. die Daten die ich bearbeiten möchte können beliebig in ein Verzeichnis abgelegt sein/werden.
    Hat jemand schon dieses Problem gehabt? Wie kann ich das umgehen? kann man( oder wie kann man) jedesmal ein veränderliches String in ein Const *char umwandeln um an opendir() übergeben zu können?

    Vielen Dank im Voraus.



  • Du gibst einfach ein normales char Array an die Funktion. Auf const casten tut der schon ganz alleine.



  • Das const vor dem Typ des Parameters bedeutet, dass der Inhalt des Speicherbereichs von opendir( ) nicht geändert werden darf:

    char path[ ] = "/foo/bar";
    opendir( path );
    
    // oder auch:
    
    char *path = malloc( 30 );
    strcpy( path, "/foo" );
    opendir( path );
    
    strcpy( path, "/bar" );
    opendir( path );
    

    Deine Variable path wird in keinem Fall von opendir( ) verändert -> so where's the problem?

    Greetz, Swordfish



  • Hi,
    vielen Dank für euere Meldungen.
    Der Pathname entnehme ich aus einer Textdatei, also habe ich ihn in eine String. Diesen String möchte ich jetzt in ein Const umwandeln.
    Soweit bleibt mein Problem bestehen.

    Gruß.



  • Ich weiss nicht was dein Problem ist, das beschriebene ist es jedenfalls nicht.



  • also das const bedeutet das der zeiger innerhalb der funktion nicht mehr verändert werden kann, aber nicht das der zeiger der übergeben wird in main() oder wo auch immer auch konstant sein muss... also nur den das char-array übergeben mit "pathname" oder "&pathname[0]". ein problem das bei windows auftreten kann: du musst zum trennen zwischen den verzeichnisen/partitionen "\" verwenden (bei neueren windows geht auch "/").



  • Hallo,
    um konkreter zu sein, hier ein Stück des programms:

    void list_dir(const char * path){
    DIR dirptr;
    struct dirent *dir;
    if((dirptr=opendir(path))==NULL)return; //Verzeichnis öffnen
    while((dir=readdir(dirptr)!=NULL){
    printf("%s\n",dir->d_name)
    } // Verzeichnis lesen und Inhalt auflisten
    closedir(dirptr);
    }
    int main(){
    char verzeichnis[100];
    const char *p;

    // ... eine Einleseroutine weist ein "verzeichnisname" aus einer
    // Textdatei in die Variable verzeichnis zu.

    sprintf(p,"%s",verzeichnis);
    list_dir(p);
    }

    Wenn anstatt von p ich q="/V1/V2/v3" habe, wird der Inhalt dieses Verzeichnisses mit list_dir(q) korrekt ausgegeben. opendir erwartet immer ein const char *.

    Mache ich etwas falsch? Ich freue mich auf Meldungen.

    Gruß.



  • Dein Problem ist nicht die opendir()-Funktion (der Compiler hat kein Problem damit, einen "normalen" char* an eine Funktion zu übergeben, die einen const char* erwartet), sondern p - du hast vergessen, den Zeiger auf einen gültigen Speicherbereich zu biegen, darum versucht sprintf() in Speicherbereiche zu schreiben, die es nichts angehen (abgesehen davon erwartet sprintf() als ersten Parameter keinen const char* - und in dieser Richtung spielt der Compiler nicht mit).

    Im Endeffekt ist der Zwischenschritt über p auch gar nicht nötig:

    int main(){ 
    char verzeichnis[100]; 
    // ... eine Einleseroutine weist ein "verzeichnisname" aus einer 
    // Textdatei in die Variable verzeichnis zu. 
    
    list_dir(verzeichnis); 
    }
    


  • Hallo Alle,

    vielen Dank für euere Unterstützung. Ihr hatte natürlich recht, das Problem war nicht der const char*, der ein normalen char beinhalten kann oder nicht.
    Das Problem lag bei meiner Einleseroutine wobei ich bis zum "\n" eingelesen hatte. Diese wurde im verzeichnisname mitgeschleppt. Folglich konnte der Inhalt dessen nicht aufgelistet.
    Das Problem habe ich behoben und alles läuft gut.

    Thanks!


Anmelden zum Antworten