xtp file durchsuchen
-
jap fast ich würde.
Config und dann Inertial-Navigation
( mit anderen worten der gesuchte string liegt in Config und dann in Inertial-Navigation )oder besser ich würde wissen an welcher position. Also ich würde wissen das pfade.at(3) und pfade.at(7) // Als Beispiel
denkst du ich sollte es so machen. Also String ändern zu </... und dann danach suchen und vergleichen ?
lg
-
Um dir das Thema vector näher zu bringen schreibe ich dir es nochmal hin. Du solltest dich damit beschäftigen. Damit du es nachvollziehen kannst habe ich es ohne Klassen oder Strukturen gehalten (eventuell auch unsauber programmiert). Das Ergebnis des ganzen sind alle übergeordneten Einträge des gesuchten "Strings", auch wenn dieser mehrfach gefunden wurde. Dazu habe ich einen mehrdimensionalen Vector benutzt, dessen Elemente auch Vectoren sind. Viel Spaß!
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { vector<string> daten; //Enthält alle zeilen aus der Datei ifstream datei; // Datei-Handle datei.open("C:\\test.txt", ios::in); // Öffne Datei aus Parameter if(!datei) { cout << "Die Datei kann nicht geoeffnet werden." << endl; } else { while (!datei.eof()) // Solange noch Daten vorliegen { string str; getline(datei, str); // Lese eine Zeile daten.push_back(str); //Zeilen in den Vector schieben } datei.close(); // Datei wieder schließen //mache etwas mit den Daten!!!! vector<string> pfade; vector<int> tiefe; for(vector<string>::iterator i = daten.begin(); i != daten.end(); ++i) { if ((*i).find(">") !=string::npos && (*i).find("<") !=string::npos) { pfade.push_back((*i).substr((*i).find("<"), (*i).size())); tiefe.push_back((*i).find("<")); } } //hier mit pfaden machen was du willst string gesucht = "string"; vector<int> funde; for(int i = 0; i < pfade.size(); i++){ if(pfade.at(i).find(gesucht) != string::npos) { funde.push_back(i); } } //Wir haben den String ein/kein oder mehrere male gefunden vector< vector<string> > unterordner; for(vector<int>::iterator i = funde.begin(); i != funde.end(); ++i){ int fund = *i; vector<string> ordner; ordner.push_back(pfade.at(fund)); //Gesuchter String in Vector schieben //Alle übergeordneten Ordner hinter den gesuchten einfügen while (fund > 0 && tiefe.at(fund) > tiefe.at(fund - 1)) { --fund; ordner.push_back(pfade.at(fund)); }; //ordner vector in vector schieben unterordner.push_back(ordner); } //in Unterordner sind jetzt ein/keine oder mehrere Vectoren die an erster Position den gesuchte´n //String enthalten und an den weiteren Positionen die übergeortneten Ordner //Ausgabe des Ergebnisses for(vector< vector<string> >::iterator i = unterordner.begin(); i != unterordner.end(); ++i){ for (vector<string>::iterator pos = (*i).begin(); pos != (*i).end(); ++pos) cout << (*pos).c_str() << endl; cout << endl; } ///////////////////////////////////////////// } cin.get(); return 0; }Testdatei sieht so aus:
<Config> <Inertial-Navigation> <Master>string</Master> </Inertial-Navigation> <Data-Files> </Data-Files> </Config>Ausgabe ist:
<Master>string</Master> <Inertial-Navigation> <Config>PS: Bisheriger Code wurde entsprechend der Anforderung umgestaltet. Harte Kost für einen STL-Anfänger.
-
habe bis jetzt immer mit einem c buch gearbeitet werde mir auf jeden ein c++ buch besorgen.
Habe deinen Code getestet. Bei deinem Beispiel geht es. Versuche ich jedoch.
<Ordner1> <Ordner2> <Ordner3> </Ordner3> <gesucht> <X>2</X> </gesucht> </Ordner2> </Ordner1>bekomme ich als resultat
<gesucht> </gesucht>jedoch ist gesucht ein unterordner von Ordner1 und Ordner2

-
//Alle übergeordneten Ordner hinter den gesuchten einfügen while (fund > 0 && tiefe.at(fund) > tiefe.at(fund - 1))hier liegt das Problem muss >= sein, da die Ordner gleiche Länge haben konnte er diese darüberliegenden nicht finden.
-
ich glaube daran liegt es nicht , bekomme speicherfehler

-
Hamster schrieb:
ich glaube daran liegt es nicht , bekomme speicherfehler

Ja wenn du es vorne Einsetzt... Ich empfehle dir C++ Primer.
-
möchte dich echt nicht nerven, du hast schon zu viel gemacht. Jedoch wenn ich dich richtig verstanden habe:
while (fund > 0 && tiefe.at(fund) >= tiefe.at(fund - 1))komme ich auch nicht auf das gewünschte ergbniss.
-
Bei mir kommt genau das Erwartet herraus nämlich:
<gesucht> //gesuchter string 1 mal gefunden </Ordner3> //liegt auf selber Ebene da auf und zu (quasi selbes Verzeichnis) <Ordner3> //liegt auf selber Ebene da auf und zu (quasi selbes Verzeichnis) <Ordner2> //liegt eine Eben drüber <Ordner1> //liegt 2 Ebenen grüber </gesucht> //gesuchter string 2 mal gefundenWenn du ein anderes Ergebnis möchtest kannst du Ergebnisse der selben Ebene leicht verhindern durch
while (fund > 0 && tiefe.at(fund) >= tiefe.at(fund - 1)) { --fund; if(tiefe.at(fund) != tiefe.at(fund - 1)) //Zusatz verhindert selbe Ebene ordner.push_back(pfade.at(fund)); }Wenn du Strings die geschlossen sind nicht haben willst, dann suche nach "</" und lösche diese Elemente aus dem richtigen (musst du selbst herrausfinden) vector. Alles in allem nichts, was du dir nicht hättest überlegen können.
-
müßte es nicht
if(tiefe.at(fund) != tiefe.at(fund + 1)) heißen ?
-
Hamster schrieb:
müßte es nicht
if(tiefe.at(fund) != tiefe.at(fund + 1)) heißen ?
Ja mitdenken zahlt sich aus

-
du denkst bestimmt ich mache es mit Absicht. Aber teste mal :
<ordner1> <ordner2> <ordner3> <ordner4> </ordner4> </ordner3> <gesuchter> </gesuchter> </ordner2> </ordner1und suche nach gesuchter ordner. Das Ergebnis wird dich überraschen...
-
nö tut es nicht, du solltest schon selber drauf kommen, was du noch ändern musst.
-
ok, nun werden nur noch die <...> ordner angezeigt
for(int i = 0; i < pfade.size(); i++){ if(pfade.at(i).find(gesucht) != string::npos &&pfade.at(i).find("</")== string::npos) { funde.push_back(i); } }jedoch verstehe ich noch nicht, warum er keine anderen ordner mehr anzeigt, wenn ich ordner4 einfüge.
Es muß etwas mit fund zu tun haben.Jedoch verstehe ich nicht wie der fehler zustande kommt.
-
Lass dir doch mal ausgeben, was in fund liegt. Ich denke nicht das dort der Fehler bei dir ist.
So wie du es hast sollte nur <gesucht> als String enthalten sein.
Edit: Schau dir die Schleife näher an!
while (fund > 0 && tiefe.at(fund) >= 0) { --fund; if(tiefe.at(fund) < tiefe.at(fund + 1)) ordner.push_back(pfade.at(fund)); };Aber auch dieses musst doch sicher nochmal ändern

-
vielleicht ist mir da eine sache noch nicht klar, fund enthält die Position von der gesuchten string. Und tiefe die Position von allen ordnern in dem vektor.
-
fund ist die stelle im Vector und tiefe enthält die leerzeichen/tabs der Zeile (das eingerückte) dies habe ich über str.find("<") gemacht.
Das: && tiefe.at(fund) >= 0 ergibt übrigends keinen Sinn weil tiefe immer >=0 ist somit kann mans weglassen...
Benutze mal diese Datei zum testen, dann siehst du dass auf dich noch Arbeit zukommt:
<ordner1> <ordner2> <ordner3> <ordner4> </ordner4> </ordner3> <gesuchter> </gesuchter> </ordner2> </ordner1> <ordner1> <ordner2> <ordner3> <ordner4> <ordner5> </ordner5> </ordner4> </ordner3> <gesuchter> </gesuchter> </ordner2> </ordner1>
-
Sry ich verstehe nicht was genau der Sinn von tiefe ist.
Kann ich nicht nachdem ich alle Ordner habe. In etwa so rangehen:
-schleife von Ordner.anfang bis Ordner.ende
- Ordner.at(1) gibt mir einen ordner wieder nachdem ich nochmal suche. Das Ergebnis
Müsste der </ordner> sein. Ist der gefundene Wert ( seine Position ) größer als funde, dann ist der gesuchte string ein Unterordner davon. Und da ich von Anfang bis Ende gehe müsste es sich doch automatisch sortieren.
Sry ich glaube ich denke noch zu einfach um deinen Ansatz richtig zu erfassen.
-
Die ordner in Vector ordner haben keine tiefe mehr, da diese ein Substring der Datei sind. Sicher kannst du es auch so machen wie du es beschreibst, dann müsstest du aber auch weitere Teile des Codes ändern umschreiben.
Aber das was du gerade schilderst kann man jetzt trotzdem machen. Nur dass die tiefe halt in einem anderen Vector als ordner gespeichert ist. Ich würde dir aber empfehlen, den Code so zu ändern, dass er 100% funktioniert und dann diesen verbessern vereinfachen.
Als gute Übung könntest du hier später Klassen verwenden!
Damit der Code mit meiner Beispieldatei funktioniert musst du nicht mehr viel ändern. Letztlich macht das was ich bei mir seit Tagen stehen habe nichts anderes als das was du erwähnt hast. Nur versuch du es mal umzusetzen! Dazu müssen nur Änderungen vor/innerhalb der Schleife durchgeführt werden und das Ergebnis meiner Testdatei ist:
<gesuchter> <ordner2> <ordner1> <gesuchter> <ordner2> <ordner1>Zwei Funde mit dessen Unterordnern.
-
ok, der Schatz liegt in dieser schleife vergraben. Leider habe ich keine Schaufel. Könntest du mir bitte mit worten erklären was genau in der schleife passiert. Da ich denn Fehler einfach nicht sehe ( ich habe noch nicht mal eine Vermutung ) ... Nur Wälder kein Bäume...
-
Hamster schrieb:
ok, der Schatz liegt in dieser schleife vergraben. Leider habe ich keine Schaufel. Könntest du mir bitte mit worten erklären was genau in der schleife passiert. Da ich denn Fehler einfach nicht sehe ( ich habe noch nicht mal eine Vermutung ) ... Nur Wälder kein Bäume...
In den Schleife werden die Unterordner ermittelt und in den Ergebnisvector geschoben. Nur leider passiert dies nicht so wie du das möchtest.
Zum einen wird die Schleife nicht beendet, wenn die tiefe 0 erreicht ist.
Zum andern stimmt die If-Abfrage nicht. Sie müsste ungefähr so aussehen tiefe.at(count) < tiefe.at(fund). Aber dafür benötigen wir noch eine Zählvariable die mit fund initialisiert wird. Und als Tipp: do while...