Warum der Segmentation fault?
-
Hallo Leute,
ich habe gerade ein Problem. Ich will eine Liste von Dateien in eine Liste speichern und diese Ausgeben. Doch ich bekomme leider nur ein Segmentation fault als Antwort.
Hier meine Main-Funktion:
#include <iostream> #include "./Filelist.h" int main(int argc, char** argv) { Filelist i; i.addDir("/home/[User]/CPP/"); i.printFiles(); return 0; }Hier mal die Funktionen der Klasse Filelist:
Filelist::Filelist() { } // _____________________________________________________________________________ void Filelist::printFiles() { for (size_t i = 0; i < _filenameList.size(); i++) { std::cout << _filenameList[i] << "\n"; } } // _____________________________________________________________________________ void Filelist::addDir(std::string path) { DIR *dirHandle; struct dirent *dirEntry; // Open a folder dirHandle = opendir(path.c_str()); do { dirEntry = readdir(dirHandle); if (dirEntry) { _filenameList.push_back(dirEntry->d_name); if (dirEntry->d_type == DT_DIR) { addDir(path + "/" + dirEntry->d_name); } } } while (dirEntry); closedir(dirHandle); }Könnt ihr mir sagen, was da falsch ist?
-
Nicht mit dem gegebenen Code. Aber Dein Debugger ist Dein Freund.
-
Kann mir gut vorstellen, dass Funktionen wie
opendirundreaddirim Fehlerfall was zurückgeben, womit man nicht weiterarbeiten sollte. Am besten guckst du mal in die Doku der API und prüfst die Rückgabewerte.
-
RETURN VALUE
The opendir() and fdopendir() functions return a pointer to the directory stream. On error, NULL is returned, and errno is set appropriately.Dh, wenn der Ordner nicht existiert oä., gibts NULL zurück und du dereferenzierst es.
-
dirHandle = opendir(path.c_str());Ich vermute, dass diese Funktion NULL zurückgibt. Wenn das der Fall ist dann bin ich mir sicher, dass dein Programm hier crasht:
dirEntry = readdir(dirHandle);Fazit: es wäre gut nach dem opendir-Aufruf zu überprüfen ob dirHandle NULL ist oder nicht.
Edit:
Upps, Ethon war schneller
-
Also ich hab ein wenig mit strace rumprobiert und hab nun folgende Funktion mittlerweile. Diese funktioniert auch soweit ganz gut.
void Filelist::addDir(std::string path) { DIR *dirHandle; struct dirent *dirEntry; // Open a folder dirHandle = opendir(path.c_str()); do { dirEntry = readdir(dirHandle); if (dirEntry) { std::string s; s.append(path); s.append(dirEntry->d_name); _filenameList.push_back(s.c_str()); // add the subfolder, if the actual file is a folder if (isdir(s)) { std::cout << "--- " << s << " is a dir.\n"; // if the dir is . or .., then don't search these folders // but all other folder if (!((s[s.size() - 1] == '.') || ((s[s.size() - 1] == '.') && (s[s.size() - 2] == '.')))) { s.append("/"); addDir(s); } } } } while (dirEntry); closedir(dirHandle); }