Rekursions Problem
lima-city → Forum → Programmiersprachen → C/C++ und D
absolute angabe
beitrag
beschrieb
bezug
datei
dateiname
eben
entry
ergebnis
erweiterung
funktion
gel
kaputt beitrag
nachsatz
null
parameter
pausen
spa
unterverzeichnis
verzeichnis
-
Hi tobi,
poste doch mal den kompletten Code. Also gezippt auf deiner Website zB. Kann mir vorstellen, dass es die Fehlersuche um einiges erleichtern w?rde.
Gru? talpa
Beitrag ge?ndert am 5.11.2005 14:15 von talpa -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hmm, das Leerzeichenproblem hab ich noch nicht festgestellt, aber ich habe zwei andere Dinge gefunden.
1. In der Funktion DateiErweiterung(..) kann die Variable i ins Nirwana abhauen, wenn eine Datei keinen "." enth?lt. Das trifft auch auf Verzeichnisnamen zu. Das f?hrt dann unterbestimmten Bedingung zu einem "Die Anweisung verweist auf..."-Fehler.
Du solltest das vielleicht so machen :
while (Dateiname.at(i) != "." && i < Dateiname.size())
Ausserdem 'strlen(Dateiname.c_str)' ist unn?tig, wenn man schon string benutzt. Besser:
Dateiname.size()
Wenn man eh string benutzt k?nnte es zB auch so aussehen:
if(Dateiname.find("."))
ReturnWert = Dateiname.substr(Dateiname.find("."),Dateiname.size());
2. Die Funktion Verzeichnis(..) sucht bei Unterverzeichnissen nur in der n?chsttieferen Ebene. Wenn du Unterverzeichnisse in einem Unterverzeichnis hast usw. werden diese nicht mehr gefunden.
Um das zu ?ndern m?sstest du bspw.
if (opendir(entry->d_name) == NULL)
durch
strPath = Dirname + "/" + TempFile;
if (opendir(strPath.c_str()) == NULL)
ersetzen. Damit der relative Bezug zu deinem Startverzeichnis stimmt.
Viel Spass beim hacken,
talpa
p.s.: Menno, die Formatierung hier im Forum macht mich nochmal fertig.
Beitrag ge?ndert am 5.11.2005 18:30 von talpa -
Das mit der Verzeichnistiefe funktioniert allerdings! Die Funktion wird sschlie?lich rekursiv aufgerufen.
Das wundert mich aber nun doch. Denn der Befehl opendir(param) bekommt als Parameter den Pfad ?bermittelt, soweit ich das verstanden habe. Jedenfalls braucht es da entweder eine absolute Angabe ( C:/Verz1/DateiX.txt ) oder eine relative Angabe ( ./Filme/Terminator.avi). Wenn jetzt die rekursive Funktion Verzeichnis(..) f?r ein Unterverzeichnis aufgerufen wird, werden zwar noch alle Dateien und Verzeichnisse in dem Unterverzeichnis ausgelesen, aber die Zeile
if (opendir(entry->d_name) == NULL)
liefert immer das Ergebnis NULL und somit werden alle Eintr?ge als Dateien klassifiziert. Das heisst Unterverzeichnis der 2.Ebene (Unter-Unterverzeichnisse) werden nicht ber?cksichtigt. Probier es doch einfach mal mit einer Verzeichnisstrukur mit 2 oder 3 Ebenen aus. Durch den Vergleich des Ergebnisses von opendir mit Null wird n?mlich nur angedeutet, dass opendir fehlgeschlagen ist und nicht, dass der ?bergeben Pfad/Dateiname auf eine Datei zeigt.
Und nochmal:
strlen(Dateiname.c_str())
k?rzer, sch?ner und mehr sexy ist :
Dateiname.size()
In diesem Sinne:
0 ist false, alles andere true
talpa
->
Beitrag ge?ndert am 5.11.2005 22:51 von talpa -
Ob etwas ein Verzeichnis ist oder nicht sollte man sowieso lieber per stat() ?berpr?fen.
Und das system("pause") am Ende ist auch keine sch?ne L?sung (funzt nicht unter Linux). Mal hier im Forum suchen, die saubere L?sung wurde mehrmals beschrieben. -
versuch mal das:
stat(strFileName.c_str(),&buf);
if(buf.st_mode & _S_IFDIR)
cout << strFileName << " is a directory." << endl;
else if(buf.st_mode & _S_IFREG)
cout << strFileName << " is a file" << endl;
else
cout << "kaputt" << endl;
--------------------------------------------
"Nachsatz: deshalb mag ich Bin?rtechnik. Da gibt es nur drei Zust?nde: High, Low und Kaputt."
Beitrag ge?ndert am 8.11.2005 00:01 von talpa -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage