xml Datei auslesen ohne externen Parser möglich?
-
Schoenheit ist unwichtig, es muss funktionieren;
wenn schon Kritik, dann bitte konstruktive
-
Das war doch Kritik

Und wenn du so denkst, hast du sowieso schon verloren.
-
Anstatt mit chars zu arbeiten würde ich strings nehmen. Die machen die Sache schonmal einfacher, da du z.B. mit string.substr() den Text zwischen den >< auslesen kannst.
Allerdings wird so eine Konstruktion schnell ziemlich hässlich und unübersichtlich, weswegen ich doch zu einem richtigen XML-Parser greifen würde (libxml, tinyxml, etc.).
Boost::Spirit ist wohl auch sehr gut, allerdings habe ich es bis jetzt noch nicht richtig zum laufen bekommen.
MfG,
ScRaT
-
Kóyaánasqatsi schrieb:
Das war doch Kritik

Und wenn du so denkst, hast du sowieso schon verloren.Aber keine konstruktive. Du bist einfach nur ein destruktiver Troll, den keiner leiden kann. Das heißt, du hast verloren und nicht er..
@OP: Mach das mit boost:regex, geht relativ einfach! Wenn du nicht weißt, wie Reguläre Ausdrücke funktionieren, musst du dich wohl einarbeiten, ist aber eine Sache, wo du extremst froh sein wirst, das zu können.. Braucht man immer mal wieder.
mfg, René~
-
NewSoftzzz schrieb:
Aber keine konstruktive. Du bist einfach nur ein destruktiver Troll, den keiner leiden kann. Das heißt, du hast verloren und nicht er..
Er weiß nun das std::ifstream::getline in dem Fall nicht so gut kommt, also war es konstruktiv. Und wer kann mich nicht leiden?
-
Ich habe jetzt folgenden Code; ich kann die Tags und die Nummern ausfiltern;
weiss jemand eine Funktion, mit der ich die Zahlen zusammen rechnen kann?#include <iostream> #include <string> #include <algorithm> #include <fstream> #include <stack> using namespace std; string parse_tag (string input) { string output; bool tag_opened = false; int j = 0; for (int i=0;i<input.length();i++) { if (tag_opened == true && input[i]=='>') return(output); else if ( input[i]=='<') tag_opened = true; else if (tag_opened ) output += input[i]; } return(output); } string parse_quote (string input) { string output; bool quote_opened = false; int j = 0; for (int i=0;i<input.length();i++) { if (quote_opened == true && input[i]=='"') return(output); else if ( input[i]=='"') quote_opened = true; else if (quote_opened ) output += input[i]; } return(output); } int main(int argc, char *argv[]) { char filename[128]; ifstream file; string zeile; stack<string> stack; string test (""); struct complex { float real; float imag; }; //char zeile[]; // Dateinamen einlesen // cout << "Dateinamen eingeben: "; // cin >> filename; // Datei öffnen // file.open(filename, ios::in); file.open("inputfile.dat"); //filename); if (file.good()) { // Wenn die Datei geoeffnet werden konnte... // An den Anfang der Datei springen file.seekg(ios::beg); while (! file.eof()) { // Die Datei zeilenweise auslesen getline(file, zeile); // zeile.replace(zeile.begin(), zeile.end(), ' '); test = parse_tag(zeile); if (!test.empty()) cout << test << endl; test = parse_quote(zeile); if (!test.empty()) cout << test << endl; // cout << "zeile" << zeile << endl; //cout << endl; stack.push (zeile); /* while (stack.size()>1) { } */ } } else { // Wenn die Datei nicht geoeffnet werden konnte cout << "Datei nicht gefunden." << endl; } return 0; }
-
Du wirst auf diese Weise wirklich nichts gescheites auf die Reihe bekommen. Vielleicht wirst du es mit viel Arbeit schaffen, dass es läuft, aber das Teil wird so instabil sein, dass du die darin investierte Zeit schnell bedauern wirst.
Bei deinem Beispielcode fehlt übrigens ein > das könnte einem mal eben kurz selbstgeschriebenen Parser schnell zum Exitus bringen.
-
Wie kann ich denn den Code verbessern?
-
SSJ schrieb:
Wie kann ich denn den Code verbessern?
Benutz RegEx? Aber warum antworte ich überhaupt, wenn du eh nicht auf die Vorschläge eingehst? -.-
mfg, René~
-
Ich habe erst als ich meinen aktuellen Code gepostet habe, gesehen, dass noch weitere Antworten gab, irgendwie habe ich keine e-mail Benachrichtigung erhalten;
ich wuerde sehr gerne auf Vorschlaege eingehen, wenn ich sie verstehen wuerde;
nein, RegEx benutze ich nicht; externe Parser sind nicht erlaubt, muss alles selber schreiben
-
SSJ schrieb:
nein, RegEx benutze ich nicht; externe Parser sind nicht erlaubt, muss alles selber schreiben
RegEx ist aber kein Parser, das ist ein normales Werkzeug und seit C++0x sogar im Standard. Dann weißt du ja jetzt, was du tun musst

mfg, René~
-
Hat C++ nicht selber irgend eine Funktion, die es erlaubt, aus einem Textfile oder auch xml-File Tags (<tag>5</tag>) durchzugehen
Noch mal auf deinen Ursprungspost einzugehen, genau DAS wäre dann RegEx.
boost::regex tagz0r("<tag>\\d+</tag>");Genau für sowas ist es da, nur die Zahl müsstest du noch mit atoi umrechnen und selber addieren.
PS: Wenn du nicht glaubst, dass RegEx standard ist und damit keine externe Funktion mehr (in C++0x), schaue dort:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n3000.pdf
Seite 1039.mfg, René~