Triviale Frage Komplettes Verzeichnis einlesen - scandir()
-
Hallo,
ich habe das Programm find_dir nach der Anleitung von http://www.pronix.de/pronix-90.html erstellt.
Nun möchte ich die Rückgaben weiterverarbeiten.
Das Programm liefert mir z.B. folgendes zurück.
48.png
convergence.png
desktop.png
meter.png
tux.pngSo weit ich das verstanden habe, stehen die Ergebnisse in
"namelist", wie kann ich gezielt Eitnräge daraus ansprechen?
"namelist[2]" z.B. für convergence.png hat leider nicht
funktioniert. Ich habe ebenfalls "free (namelist)"
und "free (*list)" schon auskommentiert, das ganze brachte aber
leider auch keinen Erfolg. Ich hoffe, ihr könnt mir helfen.Gruß tui87
/* find_dir.c */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <regex.h> #include <unistd.h> #define MAX 255 static int search = 0; static regex_t regexpr; static int my_select (const struct dirent *dp) { if(search == 0) return 1; if (regexec(®expr, dp->d_name, 0, NULL, 0) == 0) return 1; else return 0; } int main (int argc, char **argv) { int num_entries, i; struct dirent **namelist, **list; const char *ptr = NULL; char wd[MAX]; if (argc < 2) ptr = "."; else ptr = argv[1]; if(argc == 3) { if (regcomp(®expr, argv[2], REG_EXTENDED)) { printf("Problem beim Ausdruck %sn", argv[2]); return EXIT_FAILURE; } search = 1; } if((num_entries =scandir(ptr, &namelist, my_select, 0)) < 0) { fprintf (stderr, "Unerwarteter Fehler\n"); exit (EXIT_FAILURE); } chdir (ptr); getcwd (wd, MAX); printf ("Anzahl der Einträge in %s: %d\n", wd, num_entries); if (num_entries) { printf ("Die Einträge:\n"); for (i = 0, list=namelist; i < num_entries; i++, *list++){ printf (" %s\n", (*list)->d_name); free (*list); } free (namelist); printf ("\n"); } printf ("\n"); regfree(®expr); return EXIT_SUCCESS;
-
Elemente der Struktur kannst du so ansprechen, wie es in dem Code auch schon passiert:
(*list)->d_name
d_name ist ein Element. Weitere findest du sicher in der Definition der Struktur.
EDIT: free einfach auskommentieren ist natürlich keine gute Idee. Wenn du noch mehr mit den Daten machen willst, dann pack die free-Aufrufe weiter nach unten.
-
for ( i = 0, list=namelist; i < num_entries; i++, list++ )
Hier war hinten ein * zuviel. namelist ist ein Zeiger auf das erste Element eines Array von Zeigern auf dirent. Wenn list auf das erste Element dieses Array zeigt, zeigt (list+1) auf das zweite.
Demnach sollte auch namelist[2]->d_name funktionieren.