xtp file durchsuchen
-
Ich würde dir gerne nochmal nahelegen, keine Strings einzulesen, die du dann irgendwie durchsuchst, sondern direkt Tags einzulesen. Dadurch trennst du das Einlesen und Parsen der Tags von dem Aufbauen der Hierarchie, was bei deinem Code durcheinander geht und sich deshalb schneller Fehler einschleichen.
Um mit <?xml?>, <!--Kommentaren--> und <leerenTags /> klarzukommen, musste ich in dem bereits von mir geposteten Code lediglich zwei Zeilen hinzufügen:
#include <iostream> #include <fstream> #include <string> #include <stack> using namespace std; struct Tag { string name; string content; bool isClosingTag() { return name[0] == '/'; } bool isEmptyTag() { return name[0] == '?' || name[0] == '!' || *name.rbegin() == '/'; } }; istream& operator>>(istream& in, Tag& tag) { string buffer; getline(in, buffer, '<'); size_t tagClosePos = buffer.find('>'); if(tagClosePos == string::npos) { in.setstate(ios::failbit); return in; } tag.name = buffer.substr(0, tagClosePos); tag.content = buffer.substr(tagClosePos + 1); return in; } int main() { ifstream in("test.txt"); if(!in) { cerr << "Konnte Datei nicht oeffnen." << endl; return -1; } { string buffer; getline(in, buffer, '<'); // alle Zeichen bis zum ersten '<' ignorieren } stack<Tag> hierarchy; Tag currentTag; while(in >> currentTag) { if(currentTag.isEmptyTag()) ; // do nothing else if(currentTag.isClosingTag()) hierarchy.pop(); else hierarchy.push(currentTag); if(currentTag.name == "Master") break; } while(!hierarchy.empty()) { cout << hierarchy.top().name; if(hierarchy.size() > 1) cout << " <- "; hierarchy.pop(); } }Wenn dir etwas unklar ist, kannst du gerne fragen.
Edit: Jetzt können am Anfang der Datei noch beliebig viele Whitespaces stehen.
-
wie schon gesagt habe gerade ein Problem, versuche es in eine Datei einzubinden in der vector neu def wurde.
Kann ich #include <vector> machen und vector<string> anders schreiben damit es keinen Konflikt gibt ?
error C2872: 'vector': Mehrdeutiges Symbol
-
lass das using namespace std; weg und nutze überall wo nötig den qualifizierten vector, also:
#include <vector> #include <string> #include "deinvector" std::vector<std::string> blablubb;genau für/gegen solche konflikte sind namespaces da ....
-
Danke :xmas1: :xmas1:
-
Mach dir doch das Leben leicht und benutze dafür TinyXml. Das kann nicht viel, aber das besonders einfach.
Es liest dir die Datei in einen passenden Baum ein. Danach kannst du einen Visitor auf den Baum loslassen, der dann für jedes Element aufgerufen wird. Falls du dann ein entsprechendes XML-Element findest gehst du von da nur noch den Baum nach oben und setzt währenddessen den Pfad zusammen. Ist open-source, plattformunabhängig und schnell zu einer Bibliothek gebastelt, falls keine passenden libs für deinen Linker zur verfügung stehen.
-
naja ich habe viel gelernt und nun geht es auch

:xmas2:
-
Habe nun <name> w+rde gerne nur name haben
mit
daten[i] = daten[i].substr(0, daten[i].length()-1);kann ich das letzte zeichen löschen. Aber wie lösche ich das erste. Habe mir gedacht es mit daten[i].beginn() machen aber beginn ist keine länge sondern ein zeiger wenn ich richtig liege.
-
Was sind deiner Meinung nach die Parameter bei substr? (Tipp: pos, length).
-
daten[i] = daten[i].substr(1);
danke
-
Misst kurz zum Ende kommt immer noch was

Eigentlich habe ich das alles aus einem Grund gemacht.
Im alten c code:xml_configuration* eins = new xml_configuration; xml_configuration* sub_1 = eins->add_sub("Ordner1"); xml_configuration* sub_2 = sub_1->add_sub("Ordner2"); xml_configuration* sub_lever = sub_2->add_sub("Ordner3"); printf("Test %lf \n", sub_lever->get_double("X",5) );Auf xml_configuration und get_double habe ich keinen Einfluss , diese funktionen wurden von jemand anders geschrieben.
Nun wollte ich es ändern.
std::vector<std::string> funkvec; for(size_t i = 0; i < uii; i++) { xml_configuration* funkvec[i]=…; }Jedoch geht es nicht, da er funnkvec nicht erkennt.
ich habe keine Ahnung wie ich rangehen sollte.
std::vectorstd::string funkvec(20);
xml_configuration* funkvec;1>.\src\main.cpp(195) : error C2040: 'funkvec': 'xml_configuration *' unterscheidet sich von 'std::vector<_Ty>' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
1> with
1> [
1> _Ty=std::string
1> ]
-
es gibt eine möglichkeit: bitte um hilfe komme nicht mehr weiter
xml_configuration* funkvec;
funkvec->set_vector(...get_vector(const char* tag, vector* val)
set_vector(const char* tag, const vector* value, bool active)
-
Hamster, dieser Thread ist inzwischen X Seiten lang und deine letzten Postings scheinen das Vorwissen all dieser X Seiten zu verlangen. Ich denke du tust allen (neuen) Mitlesern einen gefallen, wenn du zusammenhängendere Codefragmente lieferst, am besten in den passenden Tags - eingehende Erklärung des Problem mit inbegriffen. Schließlich hast du ja offenbar ständig neue Probleme und wir reden schon gar nicht mehr über den Inhalt der ersten Seite.
-
Ganz zu Beginn ging es darum eine Datei zu erstellen welche eine xtp file liest und die „richtigen“ ordner in einen Vektor schreibt. Das geht jetzt ganz gut ( danke nochmal )
Ab Seite 8.
Kommt etwas anderes. Wofür das Vorwissen der 8 Seiten davor nicht notwendig macht.
Nun geht es darum: ( Genaue Erläuterung )
Habe einen c code: welcher mir die Möglichkeit gibt xtp Einträge aus einer xtp datei zu lesen und zu ändern. Dafür muß ich die Ordner und unterordner kennen. ( Sinn von Seite 1 bis 8 )
Beispiele:
//Speichern der neuen Variablenxml_configuration* tpcfg = new xml_configuration; tpcfg->read(“c:\\test.xtp”); //Lesen der xtp file xml_configuration* sub_i = tpcfg->add_sub("Ordner1"); xml_configuration* sub_strap = sub_i->add_sub("Ordner2"); xml_configuration* sub_lever = sub_strap->add_sub("Ordner3"); //printf("Test %lf \n", sub_lever->get_double("X",5) );// Ich kann die Variable X auslesen und ändern welche sich in Ordner3 befindet.
Beispiel Ende:
Jetzt wollte ich Ordner1 bis Ordner3 durch die in zuvor eingespeicherten vector variablen ersetzen.
Auch sub_i , sub_strap und sub_lever muss ich durch eine laufvariable ersetzen.
So:
Nun das Problem:
Anscheinend ist tpcfg das Objekt von der Klasse xml_configuration.
Diese hat verschiedene Methoden zur Auswahl.
Wie:
get_vector(const char* tag, vector* val)
set_vector(const char* tag, const vector* value, bool active)
jedoch weiß ich ab hier nicht mehr weiter. Habe schon alles versucht.
-
Das klingt für mich so wie: "Der Fluxpartikelkonduktor plifft bei Zonksträngen auf guppigen for(i=0;i<x;++i){ std::vector<asafa> sfaf; } problem wo?
-
Es müsste so aussehen.
xml_configuration* tpcfg = new xml_configuration; xml_configuration* vector; tpcfg->read(“c:\\test.xtp”); //Lesen der xtp file vector[1] = tpcfg->add_sub("Ordner1"); xml_configuration* vector[2] = vector[1]->add_sub("Ordner2"); xml_configuration* vector[3] = vector[2]->add_sub("Ordner3");.wenn das gehen würde, könnte ich das ganze in einer schleife verpacken.
Leider geht es nicht .error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'xml_configuration ' akzeptiert (oder keine geeignete Konvertierung möglich)
Muss es also mit diesen zwei funktionen gehen:
get_vector(const char tag, vector* val)
set_vector(const char* tag, const vector* value, bool active)
-
xml_configuration* vector;Du hast garantiert vorher ein
using namspace std;geschrieben, oder?
Im Folgenden dann vielleicht einvector<int> v(500);
-
Okay, dann wollen wir das mal sezieren:
xml_configuration* tpcfg = new xml_configuration; tpcfg->read(“c:\\test.xtp”); xml_configuration* vector; vector[1] = tpcfg->add_sub("Ordner1"); vector[2] = vector[1]->add_sub("Ordner2"); vector[3] = vector[2]->add_sub("Ordner3");Ich habe mal diese komischen xml_configuration*'s, die du da reingebastelt hast, wieder rausgenommen, die ergeben ja überhaupt gar keinen Sinn.
So, was haben wir da? Du definierst einen Zeiger auf ein xml_configuration. Anschleißend behandelst du diesen Zeiger so, als repräsentiere es ein Array. Das ist syntaktisch vollkommen legal, aber in diesem Fall, so wie du das machst führt das halt eher zu einem Absturz.
Okay, weiter im Programm. vector[1], was bedeutet das? Es ist identisch zu dem Ausdruck *(vector+1). Das Ergebnis dieses Ausdrucks ist vom Typ xml_configuration, also kein Zeiger darauf. Darüber meckert der Compiler im Moment.
Probier folgendes:
xml_configuration* vector[3]; vector[0] = tpcfg->add_sub("Ordner1"); vector[1] = vector[0]->add_sub("Ordner2"); vector[2] = vector[1]->add_sub("Ordner3");Siehst du wie ich Code-Tags benutzt habe? Der Quelltext ist in diesen leicht zu überschauenden Kästchen mit Syntax-Highlighting! Sieht gut aus, oder? Ist auch ganz einfach!
Edit: Beim drüberlesen erst die Indizes auf der rechten Seite im 2. Block korrigiert.
-
using namespace std;
habe ich gemacht'int' gefolgt von 'int' ist unzulässig
-
@ Decimad
- Danke dass du dir Zeit nimmt um bei meinem Problem zu helfen, ich weiß es zu schätzen.
- Habe Code Tags eingefügt.
Und … es geht , es ist so simpel krass ich sitze 5 stunden dran und bin drauf nicht gekommen….
-
Hamster schrieb:
using namespace std;
habe ich gemacht'int' gefolgt von 'int' ist unzulässig
Was passiert bei
"using namespace std;"und zusätzlichem"#include <vector>"?Du nennst eine Instanz von etwas
"vector"... was könnte daran schlecht sein wenn du obiges in Betracht ziehst?