3-Werte auslesen, speichern und verrechnen



  • 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=   3
    

    nicht 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=   3
    

    nicht 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=   3
    

    nicht 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

    Hallo Werner,
    vielen Dank für deine Erklärung!

    Ich möchte sicherheitshalber nochmals nachfragen:
    Der Unterschied zwischen

    getline( 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 zwischen

    getline( 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 getline ist 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. Ein getline würde jetzt diese Leerzeichen und das Zeilenende (LF) bis zum '=' mit in den String key ablegen. Genau das gilt es zu vermeiden, indem mit ws diese 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


Anmelden zum Antworten