3-Werte auslesen, speichern und verrechnen
-
Firewall schrieb:
Was ist jetzt so falsch daran? Es ist ja nur eine Möglichkeit von vielen.
Der Kreis, in dem man sich drecht.
Man lädt mit getline eine Zeile in einen string. Und wie einen string am besten parsen? Also sobald die Zeilen wen wenig kompelxer werden, willst Du es nicht mehr anders machen, als den string in einen stringstream zu laden und aus ihm mit getline, get und << die Daten zu holen.
Aber dann kann man auch direkt mit getline, get und << die Daten aus der Datei holen.
-
Werner Salomon schrieb:
Es ist in C++ genau eine Möglichkeit vorgesehen, eine Zahl zu lesen, und zwar mit dem operator>>double (bzw. int usw.).
Naja, das würde ich nicht so eng sehen.
Also mich würdegetline( datei >> ws, key, '=' ) >> wert;erschrecken. Viel zu kompliziert.
-
volkard schrieb:
Also mich würde
getline( datei >> ws, key, '=' ) >> wert;erschrecken. Viel zu kompliziert.
Ich weiß, dass Du das kompliziert findest. Das ist Gewohnheit. Ich finde es einfach. Du bist doch immer für einfache Lösungen .. bloss was ist einfach?

Gruß
Werner
-
Werner Salomon schrieb:
Du bist doch immer für einfache Lösungen .. bloss was ist einfach?

Drei Dinge, die nacheinander passieren sollen, auch untereinander zu schreiben.
Die Gewohnheit, das zusammenzufummeln, kommt daher, daß da eh ein while noch drumgebaut werden könnte, nehmen ich an.
-
Werner Salomon schrieb:
getline( datei >> ws, key, '=' ) >> wert;Sollte das nicht
getline( datei , key, '=' ) >> ws >> wert;heißen?
Vielleicht verstehe ich das auch falsch, aber das Ziel ist doch, daß bei
x= 3nicht 0 herauskommt, oder?
-
Salomon, du könntest ja auch einen Artikel über die Möglichkeiten von i- und ostream schreiben, dann könntest du das allen ja mal zeigen^^
Denn die Möglichkeiten der Bibliothek werden in vielen Büchern erst viel später gezeigt. Aber viel früher wird mit Dateien hantiert, sodass es nur logisch ist, dass soetwas dabei herumkommt.
-
Werner Salomon schrieb:
Es ist in C++ genau eine Möglichkeit vorgesehen, eine Zahl zu lesen, und zwar mit dem operator>>double (bzw. int usw.). Daneben gibt es noch eine Unzahl von Hilfsmitteln aus der iostream-Library, die Eingabe von Daten zu gestalten. Man kann nun beobachten, dass diese Funktionalität von vielen Leuten schlicht ignoriert wird. Und das ist nervig - da ist die Autobahn, auf der man fahren könnte, und es wird darüber diskutiert, wie man auf Nebenstraßen am besten an's Ziel kommt.
Beim Durchlesen deiner postings hatte ich viele "Aha"s und "Sehr schön gelöst"-Gedanken. Auf viele deiner Lösungen wäre ich nicht gekommen - hätte meist intuitiv eine trivialere und weniger elegantere Lösung programmiert.
Nun stellt sich mir die Frage: Wie hast du dir dein Wissen und deinen Stil angeeignet. In den meisten Büchern werden die Möglichkeiten entweder garnicht so umfangreich erläutert, oder aber es fehlt an Beispielen für elegante und effiziente Umsetzungen. Allein das Wissen über die Existenz bestimmter Funktionen, Klassen etc. reicht nunmal oft nicht aus, diese auch sinnvoll zu nutzen.
Kannst du Literatur zu diesem Thema empfehlen oder von mir aus auch Tutorials?
-
thomas___ schrieb:
Werner Salomon schrieb:
getline( datei >> ws, key, '=' ) >> wert;Sollte das nicht
getline( datei , key, '=' ) >> ws >> wert;heißen?
Vielleicht verstehe ich das auch falsch, aber das Ziel ist doch, daß bei
x= 3nicht 0 herauskommt, oder?
Hallo Thomas,
gut dass Du fragst und traurig, dass Dir noch niemand geantwortet hat.
Man unterscheidet beim Einlesen zwischen dem formatierten und dem unformatierten Lesen. Formatiert lesen heißt alle White-Space-Zeichen ab der aktuellen Leseposition zu überlesen und erst auf das erste nicht Leerzeichen zu reagieren. Vorausgesetzt dass es nicht explizit mit 'noskipws' abgeschaltet wurde.
Alle Streaming-Operatoren lesen formatiert, also auch das >>double, dass heißt, dass führende Leerzeichen nie ein Problem sind.
getline liest unformatiert. Hier werden ab Leseposition alle Zeichen mitgenommen - inklusive Leerzeichen und Zeilenende. Deshalb auch das >>ws vor(!) dem Aufruf von getline.Gruß
Werner
-
Hier stand Müll
-
inter2k3 schrieb:
Beim Durchlesen deiner postings hatte ich viele "Aha"s und "Sehr schön gelöst"-Gedanken. Auf viele deiner Lösungen wäre ich nicht gekommen - hätte meist intuitiv eine trivialere und weniger elegantere Lösung programmiert.
Danke für das Kompliment

inter2k3 schrieb:
Nun stellt sich mir die Frage: Wie hast du dir dein Wissen und deinen Stil angeeignet. In den meisten Büchern werden die Möglichkeiten entweder garnicht so umfangreich erläutert, oder aber es fehlt an Beispielen für elegante und effiziente Umsetzungen. Allein das Wissen über die Existenz bestimmter Funktionen, Klassen etc. reicht nunmal oft nicht aus, diese auch sinnvoll zu nutzen.
.. das ist wahr! Ich habe mit dem Lernen von C++ angefangen mir auch das Know How über Iostreams anzueignen. Das war so ca. 1996 und dauerte etwa 5 Jahre bis ich einigermaßen auf Stand war. Ganz hört dass ja nie auf.
Ich habe auch erst alle Fehler durchgemacht - meinen eigene ostream geschrieben, der von std::ostream abgeleitet war, um danach zu sehen, dass das ziemlich daneben ist, und anderes mehr. So etwa 1999 habe ich mir dann C++ Iostreams Handbook von Steve Teale besorgt. Das Buch war damals schon veraltet und kurze Zeit später erschien Standard C++ IOStreams and Locales von Langer & Kreft. Letzteres ist zwar ein umfassendes Werk, aber für meinen Geschmack stand trotzt erheblichen Umfangs (670 Seiten) immer noch zu wenig drin. Zumindest lässt es sich gut lesen, da es zwar in englisch aber von deutschen Autoren verfasst ist.
Und den C++-Standard selber habe ich mir natürlich auch genau angesehen. Zum Lernen ist der aber völlig ungeeignet.Sehr viel dazu gelernt habe ich später dann hier im Forum einfach durch die Fragen, die gestellt worden sind. Dann war die Motivation da, mir auch Antworten zu überlegen, die mit dem was im C++-Standard steht, vom Geist/Stil her übereinstimmen.
inter2k3 schrieb:
Kannst du Literatur zu diesem Thema empfehlen oder von mir aus auch Tutorials?
(s.o.), aber eigentlich nicht wirklich. Das 'Standard C++ IOStreams and Locales' kann man sich als Nachschlagewerk in die Firmen/Uni-Bibliothek stellen, als privates Lesevergnügen ist es weniger geeignet.
Ansonsten hier im Forum Deine Probleme bzw. Codestücke vorstellen und diskutieren.Gruß
Werner
-
Werner Salomon schrieb:
thomas___ schrieb:
Werner Salomon schrieb:
getline( datei >> ws, key, '=' ) >> wert;Sollte das nicht
getline( datei , key, '=' ) >> ws >> wert;heißen?
Vielleicht verstehe ich das auch falsch, aber das Ziel ist doch, daß bei
x= 3nicht 0 herauskommt, oder?
Hallo Thomas,
gut dass Du fragst und traurig, dass Dir noch niemand geantwortet hat.
Man unterscheidet beim Einlesen zwischen dem formatierten und dem unformatierten Lesen. Formatiert lesen heißt alle White-Space-Zeichen ab der aktuellen Leseposition zu überlesen und erst auf das erste nicht Leerzeichen zu reagieren. Vorausgesetzt dass es nicht explizit mit 'noskipws' abgeschaltet wurde.
Alle Streaming-Operatoren lesen formatiert, also auch das >>double, dass heißt, dass führende Leerzeichen nie ein Problem sind.
getline liest unformatiert. Hier werden ab Leseposition alle Zeichen mitgenommen - inklusive Leerzeichen und Zeilenende. Deshalb auch das >>ws vor(!) dem Aufruf von getline.Gruß
WernerHallo Werner,
vielen Dank für deine Erklärung!Ich möchte sicherheitshalber nochmals nachfragen:
Der Unterschied zwischengetline( datei >> ws , key, '=' ) >> wert;und
getline( datei , key, '=' ) >> wert;besteht darin, daß bei letzterem im String key evtl. am Anfang whitespaces stehen. Die Variable wert hat nach der Anweisung in beiden Fällen den gleichen Wert. Richtig?
(Ich hatte den OP zuerst so verstanden, daß die Reihenfolge in der Datei immer gleich ist und man das "W1=" auch "wegwerfen" könnte. Dann hätte auch die zweite Möglichkeit zum Ziel geführt, oder?)
-
thomas___ schrieb:
Ich möchte sicherheitshalber nochmals nachfragen:
Der Unterschied zwischengetline( datei >> ws , key, '=' ) >> wert;und
getline( datei , key, '=' ) >> wert;besteht darin, daß bei letzterem im String key evtl. am Anfang whitespaces stehen. Die Variable wert hat nach der Anweisung in beiden Fällen den gleichen Wert. Richtig?
ja richtig!
thomas___ schrieb:
(Ich hatte den OP zuerst so verstanden, daß die Reihenfolge in der Datei immer gleich ist und man das "W1=" auch "wegwerfen" könnte. Dann hätte auch die zweite Möglichkeit zum Ziel geführt, oder?)
Nein - das datei>>ws vor(!) dem
getlineist absolut notwendig, wenn mehr als eine Zeile gelesen werde soll. Nach Lesen des ersten Eintrags (w1=268) steht der Lesezeiger auf dem Zeilenende oder sogar auf den evt. vorhandenen Leerzeichen am Zeilenende in der ersten Zeile. Eingetlinewürde jetzt diese Leerzeichen und das Zeilenende (LF) bis zum '=' mit in den Stringkeyablegen. Genau das gilt es zu vermeiden, indem mitwsdiese Leerzeichen übersprungen werden.Gruß
Werner
-
Wenn der Name des Schlüssels nicht weiter verarbeitet werden muß, ist es doch egal, ob du ihn nun mit oder ohne Leerzeichen einliest (wobei, dann könnte man die getline()-Konstruktion auch durch istream::ignore() ersetzen). Wenn du den Namen weiterverwenden willst, mußt du dich auch noch um Leerzeichen hinter dem Schlüsselnamen kümmern.
-
CStoll schrieb:
Wenn der Name des Schlüssels nicht weiter verarbeitet werden muß, ist es doch egal, ob du ihn nun mit oder ohne Leerzeichen einliest (wobei, dann könnte man die getline()-Konstruktion auch durch istream::ignore() ersetzen). Wenn du den Namen weiterverwenden willst, mußt du dich auch noch um Leerzeichen hinter dem Schlüsselnamen kümmern.
Hallo CStoll,
das ist natürlich richtig. Ich hatte Thomas' zweite Frage völlig missverstanden. Und istream.ignore ist in diesem Fall auch die bessere Wahl und dann wäre auch eindeutig, was das Programm tun soll.
Gruß
Werner