[gelöst] Unterschiedl. Textzeilen mit gleichem Aufbau ("String Int") zerlegen und Wert in entspr. Variablen?
-
Hi,
ich steh mal wieder vor einem mehr oder weniger kleinen Problem, aber vielleicht erstmal kurz zu dem was ich erreichen möchte. Ich habe eine Textdatei aus der ich mehrere Textzeilen Zeile für Zeile auslese mittels einer Schleife und der Inhalt wird in einem String gespeichert. Kommentare und Leerzeilen werden einfach ignoriert, die brauche ich ja nicht. Kurzes Beispiel:
// Video Setup FullscreenX 1680 FullscreenY 1050 WindowX 640 WindowY 480 BPP 16 Fullscreen 0Nach dem ersten durchlauf meiner Schleife habe ich also als Inhalt in meinem String "FullscreenX 1680" stehen. Ich möchte nun diesen String, und auch alle weiteren, so bearbeiten das ich die 1680 hinterher als Wert in meiner entsprechenden Variable habe.
Kleines Beispiel:
int FullscreenX, FullscreenY, WindowX, WindowY, BPP; bool Fullscreen; // Code mit den Bedingungen für meine Schleife { // die mir als Ergebnis in meinem String "line" eine Textzeile liefert sscanf( line.c_str(), "FullscreenX %i", &FullscreenX); }Dabei entstehen für mich nun einige Probleme. Zum einem klappt dieser Code nur für die erste Zeile. FullscreenX kann ich ja noch durch Platzhalter ersetzen, aber trotzdem speichert er den Inhalt ja immer in der gleichen Variable FullScreenX. Meine Idee wäre nun die Zahl in einer Variable z.B. int temp; zwischenzulagern und dann mittels eines switch zu überprüfen in welche Variable mein Wert muss. Leider hapert es genau dabei. Wie bekomme ich es hin das ich in etwa so etwas veranstalten kann:
switch( WertFuerVariable) { case FullscreenX: FullscreenX = temp; break; case FullscreenY: FullscreenY = temp; break; case WindowX: WindowX = temp; break; // Und so weiter... }Ich müsste demnach doch aus meiner Textzeile nicht nur den Wert sondern auch den Text (%s) auslesen und in WertfuerVariable Zwischenspeichern als Grundlage für mein switch? Leider bekomme ich diesen ganzen Ansatz mal überhaupt nicht zum laufen.
Ich befürchte ich mach mir das Leben wieder komplizierter als es ist.
Achso, bevor ich es vergesse, ich bin noch ziemlich blutiger Anfänger, also bitte bei eventuellen Hilfsvorschlägen: laaangsaaam und lieber eine Erklärung zu viel als eine zu wenig. Das wäre sehr nett. 
Ich bin natürlich auch für gänzlich andere Lösungsvorschläge offen. Wie gesagt, ich bin noch neu in C++ und denke deshalb oft viel komplizierter als es eigentlich ist.

Gruß Daniel
-
Ja, du machst dir das Leben unnötig schwer dadurch, dass du C statt C++ programmierst. Eine spontane Idee für eine Lösung in C++ (ungefährer Code, aber so oder ähnlich geht das):
map<string,int> wertetabelle; string feldname; int wert; while(eingabedatei>>feldname>>wert) wertetabelle.insert(pair<string,int>(feldname,wert)); FullscreenX = wertetabelle["FullscreenX"]; FullscreenY = wertetabelle["FullscreenY"]; // usw.
-
Na das hört sich ja mal sehr interessant an...
Da muss ich mich mal einlesen. Das ist wohl auch mein größtes Problem. Dadurch das ich halt neu bin und die meisten Funktionen überhaupt nicht kenne die einem C++ bereit stellt, kann ich sie auch nicht nutzen. Zudem verwende ich immer die Referenz auf cplusplus.com, die ist zwar gut aber leider auch auf englisch. Gibt es das nicht eventuell auch irgendwo auf deutsch? Weil das würde mir natürlich auch viele Dinge erleichtern einfach weil man sich mal viel schneller einen Überblick dadrüber machen könnte was überhaupt so geht.
Ich werde mich jetzt mal dran versuchen und mich später noch mal melden. Danke.
-
Hey,
also erst mal, ne deutsche Referenz kenn ich nicht.
Aber probiers auf englisch ist besser. Wollte am anfang au immer alles in deutsch, habs dann einfach mal probiert wieder mit englisch, da es jetzt eh wieder in der schule kommt und klappt viel besser und verstehe alles=)
Würd dir vll au empfehlen en gutes c++ buch zu lesen, ist einfach unersetzlich.So nun zu dem Problem, schau mal in der referenz nach stringstream.
Ließ jeden string einzeln ein. Der 1. Kann immer in n string bleiben, den 2. Wandelst du mittels stringstream zu einer int variable.Kann dir heut abend wenn nötig auch gern den code dazu posten, weil jetzt bin ich arbeiten und hab keine zeit.
Sorry.Hoffe konnte dir helfen.
Gruß freeG
-
So, ich hab jetzt wohl euer beide Vorschläge verwendet und rausgekommen ist da bei mir folgendes:
map< string, int> table; // soll meine Daten sammeln // Bedingungen für meine Schleife welche mir... { // ...jeweils 1 Textzeile aus meiner Datei als String "line" wiedergibt (z.B. "FullscreenX 1680") size_t posFirst = line.find_first_of( "\t"); // sucht das erste vorkommen eines Tab size_t posLast = line.find_last_of( "\t"); // sucht das letzte vorkommen eines Tab string option = line.substr( 0, posFirst); // liefert vom ersten Zeichen des Strings bis zum ersten Tab string tempValue = line.substr( posLast + 1); // liefert ab dem letzten Tab bis zum letzten Zeichen des Strings stringstream temp; temp << tempValue; // schreibt den Wert (string) in den stringstream int value; temp >> value; // liest den Wert (int) aus dem stringstream table.insert( pair< string, int>( option, value)); // füllt meine Datensammlung } // hier kann ich nacheinander meine Daten aus meiner Sammlung in meine Variablen schreiben (z.B. fullscreenWidth = table["FullscreenX"];)Das ganze funktioniert wunderbar. Wobei, kann ich eigentlich den Teil mit tempValue überspringen in dem ich line.substr() direkt in ein int schreibe? Müsste ich mal ausprobieren. Dann könnte ich mir glatt auch den Teil mit dem stringstream sparen.
Ich musste übrigens das erste und das letzte vorkommen von Tabs prüfen weil ich in meiner Textdatei zur Übersicht alle Werte untereinander damit positioniert habe, wodurch ich natürlich unterschiedlich viele Tabs in den Zeilen habe.[EDIT]
Es klappt zumindest so nicht:int value = line.substr( posLast + 1);
-
Warum die händische Zerlegung? Schreib die Zeile in einen stringstream und mach
dein_stringstream << deine_zeile; dein_stringstream >> dein_string >> dein_int;Oder falls du auch Bezeichner mit Whitespace im Namen zulassen willst, kannst du auch automatisch nach Tabulatorzeichen trennen:
dein_stringstream << deine_zeile; getline(dein_stringstream, dein_string, '\t'); // Alles bis zum ersten Tab in dein_string speichern dein_stringstream >> dein_int; // Und den darauf folgenden int können wir direkt auslesen.
-
SeppJ schrieb:
Warum die händische Zerlegung?
Weil ich keine Ahnung hab von dem was ich hier mache?
Ist natürlich noch mal sehr viel kürzer und übersichtlicher. Ich zeig besser mal nicht meinen ganzen Code... Das wird dann peinlich... 