Wert nach einem bestimmten Satz in einer txt datei suchen
-
Hallo BoomC,
BoomC schrieb:
Ich weiss nur ungefähr was ein XML-Parser ist und würde doch gerne ein eigenes in C++ Programm haben das den Text Zeile für Zeile liest und dann entsprechend meinen Anweisungen Filtert.
.. nur soviel: man liest nicht 'Zeile bei Zeile', und schon gar nicht bei einer XML-Datei, weil diese nämlich u.U. gar keine Zeilen hat.
Es ist schon zu empfehlen, einen einfachen Parser zu nutzen - z.B. TinyXML.
Mit C++-Standardmitteln sähe es z.B. so aus:#include <iostream> #include <fstream> #include <string> #include <limits> // std::numeric_limits<> int main() { using namespace std; ifstream in("datei.xml"); // <== hier richtigen Dateinamen eintragen if( !in.is_open() ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -2; } while( in ) // solange kein (Lese-)Fehler aufgetreten ist { // überlese alles bis '<' und "MOVE" for( string token; in.ignore( std::numeric_limits< std::streamsize >::max(), '<' ) >> token && token != "MOVE"; ) ; // -- hier geht's los; Attribute lesen ... int x, y; int xy_gelesen = 0; for( string attribut; xy_gelesen != 3 && getline( in >> ws, attribut, '=' ); ) // Lese zunächst den Namen des Attributs -> 'attribut' { char hk; // "-Zeichen if( attribut == "X" ) { if( !(in >> hk >> x >> hk) ) break; // Lesefehler xy_gelesen |= 1; } else if( attribut == "Y" ) { if( !(in >> hk >> y >> hk) ) break; // Lesefehler xy_gelesen |= 2; } else (in >> hk).ignore( std::numeric_limits< std::streamsize >::max(), '"' ); // überspringe andere Attribute } if( xy_gelesen == 3 ) cout << "x=" << x << " y=" << y << endl; } return 0; }Mit tinyxml2 wird es übersichtlicher und sicherer:
#include <iostream> #include <fstream> #include <string> #include <tinyxml2.h> void parse( const tinyxml2::XMLNode& parent ) { using namespace std; using namespace tinyxml2; for( const XMLNode* node = parent.FirstChild(); node; node = node->NextSibling() ) { const XMLElement* elem = node->ToElement(); if( !elem ) continue; if( string(elem->Name()) == "MOVE" ) { int x = elem->IntAttribute( "X" ); int y = elem->IntAttribute( "Y" ); cout << "x=" << x << " y=" << y << endl; } else parse( *elem ); } } int main() { using namespace std; using namespace tinyxml2; XMLDocument doc; if( doc.LoadFile("datei.xml") != 0 ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -2; } parse( doc ); return 0; }probier's einfach aus.
Gruß
Werner
-
SeppJ schrieb:
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.
Was für ein Quatsch. Verständnis ist ein überbewertetes Konzept.
Back in the good old days-- the "Golden Era" of computers-- it was easy to separate the men from the boys (sometimes called "Real Men" and "Quiche Eaters" in the literature). During this period, the Real Men were the ones who understood computer programming, and the Quiche Eaters were the ones who didn't.
...http://www.pbm.com/~lindahl/real.programmers.html
Nach all den Jahren immer noch eine Freude das zu lesen.
EDIT:
Das zweite, gelöschte Zitat hatte nur wenig mit dem Thema zu tun.
-
Das heißt, du nennt dich selbst einen Quiche Eater?

-
Man kann eine XML Datei noch einfacher lesen

CMarkup xml; if (xml.Load ("test.xml")) { while (xml.FindElem ("MOVE")) { int fId = _tstoi (xml.GetAttrib ("FlowID")); double x = _tstof (xml.GetAttrib ("X")); double y = _tstof (xml.GetAttrib ("Y")); } }Edit: Schliessende ) vergessen.
-
SeppJ schrieb:
Das heißt, du nennt dich selbst einen Quiche Eater?

Nein, weil ich nur rohes Fleisch esse, das ich aus dem lebendigen Tier reisse. :p
-
Danke Jungs für eure Antworten ich mache mich sofort dran.
Noch zur XML Sache.....Es ist nur diesmal eine XML und eigentlich sehr selten, normalerweise sind das ganz andere Formate und unterscheiden sich sehr also werde ich versuchen ein Prog zu schreiben das nach bestimmten Mustern sucht.
-
Hallo Werner Salomon
Zu deinem "mit normalen mitteln" Beispiel.
So weit alles verstanden nur ich sehe nicht die Anweisung die die Werte in den x,y, Variablen Einfügen. Ansonsten funktioniert es wie ich es wollte. Jetzt muß ich sehen wie den 1-tn x Wert mit den 2-ten und den 2-ten mit den 3-ten usw.. vergleichen kann.
-
das passiert in den Zeilen 29 und 35.
Siehe dazu auch Extraktor für int.Das ist genau dasselbe wie
int x; if( cin >> x ) // hier wird eine Zahl von der Standardeingabe gelesen cout << "Gelesen: " << x << endl;Gruß
Werner
-
Die Zeilen sind eher Fragen als Anweisungen.
In den Link sind normale Wertezuweisungen auf n.
-
BoomC schrieb:
Die Zeilen sind eher Fragen als Anweisungen.
In den Link sind normale Wertezuweisungen auf n.abgefragt wird das Ergebnis des Einlesens.
Hinter dem Link steht:
// example on extraction #include <iostream> // std::cin, std::cout, std::hex int main () { int n; std::cout << "Enter a number: "; std::cin >> n; std::cout << "You have entered: " << n << '\n'; std::cout << "Enter a hexadecimal number: "; std::cin >> std::hex >> n; // manipulator std::cout << "Its decimal equivalent is: " << n << '\n'; return 0; }Die Zuweisung an 'n' geschieht in den Zeilen 8 und 12. Korrekt müsste es hier heißen:
// example on extraction #include <iostream> // std::cin, std::cout, std::hex int main () { int n; std::cout << "Enter a number: "; if( std::cin >> n ) std::cout << "You have entered: " << n << '\n'; std::cout << "Enter a hexadecimal number: "; if( std::cin >> std::hex >> n ) // manipulator std::cout << "Its decimal equivalent is: " << n << '\n'; return 0; }siehe auch Abfrage auf Ok.
Werner Salomon schrieb:
int x; if( cin >> x ) // hier wird eine Zahl von der Standardeingabe gelesen cout << "Gelesen: " << x << endl;.. oder ganz ausführlich:
int x; cin >> x; // hier wird eine Zahl von der Standardeingabe gelesen if( !cin.fail() ) // hier wird geprüft, ob das ohne Fehler passierte cout << "Gelesen: " << x << endl;beide Code-Schnipsel machen exakt das selbe.
Gruß
Werner
-
OK Danke.
Ich wusste nicht das man solche Abkürzungen schreiben kann. Habs aber jetzt vertsanden.
-
Was mache ich falsch?
Ich wollte den einfachen Code von Werner Salomon etwas ändern um die Werte in einem Array zu speichern zu vergleichszwecken jedoch sind die Gleitkommazahlen zu kurz. Eigentliche Zahl:1300.93576; Angezeigte Zahl: 1300.94;int zaehler=0; void da(double x,double y){ using namespace std; while (zaehler != 2) { double koordinaten[2] = {0,0}; koordinaten[zaehler]=x; zaehler++; koordinaten[zaehler]=y; zaehler++; cout<<koordinaten[0]<<koordinaten[1]<<endl; }
-
Was mache ich falsch?
du weißt zu wenig über programmierung, um zu erkennen was du vor dir siehst.
einfache gegenfrage: wenn computer fließkommawerte absolut exakt speichern würden, wie viel speicher wäre nötig, um zum beispiel mit PI zu rechnen?
-
64bit
-
BoomC schrieb:
64bit
Begründe doch mal, wieso man 64 Bit braucht, um Pi darzustellen. Warum reichen 63 nicht? Sind 65 zu viel?
-
Ich schon zwei mal gesagt das ich noch ein Anfänger bin.
Ich weiss nur das PI 13 stellen hat un ein float zu klein und ein long double könnte gehen jedoch ist das Speicherverschwendung.
-
BoomC schrieb:
Ich schon zwei mal gesagt das ich noch ein Anfänger bin.
Ich weiss nur das PI 13 stellen hat un ein float zu klein und ein long double könnte gehen jedoch ist das Speicherverschwendung... die wollen Dich auf den Arm nehmen

PI hat als numerische Größe unendlich viele Stellen und kein Computer im Universum kann PI als Zahl exakt darstellen.Bei der Ausgabe einer Zahl (z.B. per
std::cout) wird diese mit einer (maximalen) festen Anzahl von Ziffern dargestellt (Default=6). Schau Dir mal setprecision an.Gruß
Werner
-
Werner Salomon schrieb:
BoomC schrieb:
Ich schon zwei mal gesagt das ich noch ein Anfänger bin.
Ich weiss nur das PI 13 stellen hat un ein float zu klein und ein long double könnte gehen jedoch ist das Speicherverschwendung... die wollen Dich auf den Arm nehmen

Jain. Eigentlich wollte ich durch die Gegenfrage eine Reflektion über die Unsinnigkeit der Antwort "64" anregen. Ich hatte halt nicht im geringsten erwartet, dass dem TE tatsächlich das nötige mathematische Wissen fehlt. Dadurch sieht mein Beitrag jetzt bösartiger aus als er gedacht war, weil meine sarkastische Bemerkung unanbsichtlich genau ins Schwarze getroffen hat.
-
Das wusste ich auch,dache nur ich sollte PI darstellen (3.14159265359) egal.
Find ich toll von den Moderatoren wie hilfreich sie sind...machen sich lustig über mich. Danke Werner Salomon für den link ich werde es gleich ausprobieren.
-
BoomC schrieb:
Das wusste ich auch,dache nur ich sollte PI darstellen (3.14159265359) egal.
Aber das ist nicht Pi! Schon Captain Kirk hat anno 1966 Computer damit verwirrt, dass sie Pi bis zur letzten Stelle berechnen sollten. So etwas ist Allgemeinwissen!