<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem: Werte in eine map einlesen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte folgendes machen:</p>
<p>Ich habe eine Datei, die nach folgendem Schema aufgebaut ist:</p>
<pre><code>ABC | 1.23 | Kommentar 1
DEF | 4.56 | Kommentar 2
GHI | 7.89 | Kommentar 3
</code></pre>
<p>Diese Datei soll nun eingelesen werden und die 1. und 2. Spalte soll in einer map gespeichert werden, so dass man über die map direkt auf die einzelnen Werte zugreifen kann.</p>
<p>Ich habe hier im Forum schon nach einer Lösung gesucht und bin jetzt soweit gekommen:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot; // hier steht map&lt;string, string&gt; data;
#include&lt;iostream&gt;
#include&lt;map&gt;
#include&lt;vector&gt;
#include&lt;string&gt;
using namespace std;
bool read() {
    vector&lt;string&gt; lines;
    string::size_type found = string::npos;
    ifstream IN (&quot;text.txt&quot;);
    if (IN.is_open()) {
        vector&lt;string&gt;::iterator itr = lines.begin();
        while (itr != lines.end()) {
            found = (*itr).find(&quot;|&quot;);
            if (found != string::npos) {
                test::data[(*itr).substr(0, found-1)] = (*itr).substr(found+1, (*itr).find(&quot;|&quot;)-1);
            }
            ++itr;
        }
        IN.close();
        return true;
    } else {
        cout&lt;&lt;FEHLER&lt;&lt;&quot;\n&quot;;
        return false;
    }
}
</code></pre>
<p>Beim Kompilieren bekomme ich zwar keine Fehlermeldung, aber ich erhalte hier auch keine Ausgabe:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
using namespace std;

int main()
{
    test Test;
    Test.read();
    string def = Test.data[&quot;DEF&quot;];
    cout&lt;&lt;&quot;def = &quot;&lt;&lt;def&lt;&lt;&quot;\n&quot;;

    return 0;
}
</code></pre>
<p>Könnt Ihr mir da vielleicht weiterhelfen?<br />
So kann ich die map auch nicht mit &lt;string, double&gt; verwenden, sondern muss &lt;string, string&gt; nehmen, was natürlich auch nicht sein sollte...</p>
<p>Vielen Dank schon mal!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203927/problem-werte-in-eine-map-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 13:47:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203927.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jan 2008 10:49:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Mon, 28 Jan 2008 10:49:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte folgendes machen:</p>
<p>Ich habe eine Datei, die nach folgendem Schema aufgebaut ist:</p>
<pre><code>ABC | 1.23 | Kommentar 1
DEF | 4.56 | Kommentar 2
GHI | 7.89 | Kommentar 3
</code></pre>
<p>Diese Datei soll nun eingelesen werden und die 1. und 2. Spalte soll in einer map gespeichert werden, so dass man über die map direkt auf die einzelnen Werte zugreifen kann.</p>
<p>Ich habe hier im Forum schon nach einer Lösung gesucht und bin jetzt soweit gekommen:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot; // hier steht map&lt;string, string&gt; data;
#include&lt;iostream&gt;
#include&lt;map&gt;
#include&lt;vector&gt;
#include&lt;string&gt;
using namespace std;
bool read() {
    vector&lt;string&gt; lines;
    string::size_type found = string::npos;
    ifstream IN (&quot;text.txt&quot;);
    if (IN.is_open()) {
        vector&lt;string&gt;::iterator itr = lines.begin();
        while (itr != lines.end()) {
            found = (*itr).find(&quot;|&quot;);
            if (found != string::npos) {
                test::data[(*itr).substr(0, found-1)] = (*itr).substr(found+1, (*itr).find(&quot;|&quot;)-1);
            }
            ++itr;
        }
        IN.close();
        return true;
    } else {
        cout&lt;&lt;FEHLER&lt;&lt;&quot;\n&quot;;
        return false;
    }
}
</code></pre>
<p>Beim Kompilieren bekomme ich zwar keine Fehlermeldung, aber ich erhalte hier auch keine Ausgabe:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
using namespace std;

int main()
{
    test Test;
    Test.read();
    string def = Test.data[&quot;DEF&quot;];
    cout&lt;&lt;&quot;def = &quot;&lt;&lt;def&lt;&lt;&quot;\n&quot;;

    return 0;
}
</code></pre>
<p>Könnt Ihr mir da vielleicht weiterhelfen?<br />
So kann ich die map auch nicht mit &lt;string, double&gt; verwenden, sondern muss &lt;string, string&gt; nehmen, was natürlich auch nicht sein sollte...</p>
<p>Vielen Dank schon mal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444939</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Mon, 28 Jan 2008 10:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Mon, 28 Jan 2008 10:52:41 GMT]]></title><description><![CDATA[<p>Wenn ich nix übersehen habe, dann liest du den Dateiinhalt ja garnicht ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Den vector&lt;string&gt; brauchst du eigentlich auch nicht, du müsstest nur Zeile für Zeile aus der Datei einlesen, den '|' rausfiltern (wie du es ja mit den Elementen aus dem leeren vector &quot;lines&quot; versuchst) und in die map schreiben.<br />
Wie gesagt, die liest die Datei momentan einfach noch nicht ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444944</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 28 Jan 2008 10:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Mon, 28 Jan 2008 14:29:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;test.hpp&quot; // hier steht map&lt;string, string&gt; data;
#include &lt;string&gt;
#include &lt;fstream&gt;

bool read_data() 
{
    std::ifstream file_stream(&quot;text.txt&quot;);
    if (!file_stream) return false;

    std::string string;
    while (std::getline(file_stream, string))
    {
        const std::string::size_type pos(string.find(&quot;|&quot;));

        if (pos != std::string::npos) 
            test::data.insert(std::make_pair(string.substr(0, pos - 1), string.substr(pos + 1, string.find(&quot;|&quot;, pos) - 1)));
    }
    return true;
}
</code></pre>
<p>wobei man das viel ordentlicher machen könnte! Hab aber leider nicht genügend Zeit dir das jetzt zu machen ... versuch es jetzt mal selbst nochmal, wo du schon einen ansatz hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445112</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 28 Jan 2008 14:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 07:51:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erstmal danke für Eure Antworten.<br />
Hab das jetzt mal so gemacht:</p>
<pre><code class="language-cpp">bool read() {
    map&lt;string, string&gt; data;
    string::size_type found = string::npos;
    ifstream IN (&quot;test.txt&quot;);
    if (IN.is_open()) {
        string zeile;
        while (getline(IN, zeile)) {
            found = zeile.find_first_of(&quot;|&quot;);
            size_t begin = zeile.find_first_not_of(' ', found + 1);
            size_t end = zeile.find_first_of('|', found + 1);
            size_t length = end - begin;
            data[zeile.substr(0, found-1)] = zeile.substr(begin,length);
        }
        IN.close();
        return true;
    } else {
        cout&lt;&lt;&quot;ERROR\n&quot;;
        return false;
    }
}
</code></pre>
<p>Jetzt funktioniert es soweit.<br />
Kann man mit Sicherheit noch viel, viel ordentlicher machen, aber ich bin da halt leider noch nicht so geübt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Jetzt muss ich für die map allerdings &lt;string, string&gt; verwenden, da sonst das substr nicht funktioniert.<br />
Jedoch sollte die map je nachdem als &lt;string, int&gt; oder &lt;string, double&gt; oder &lt;string, string&gt; eingesetzt werden, also mit einem Template.</p>
<p>Wie muss ich denn das einbauen? Irgendwie komm ich da gerade nicht weiter...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445458</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Tue, 29 Jan 2008 07:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 10:09:59 GMT]]></title><description><![CDATA[<p>LadyM schrieb:</p>
<blockquote>
<p>Jetzt muss ich für die map allerdings &lt;string, string&gt; verwenden, da sonst das substr nicht funktioniert.</p>
</blockquote>
<p>Du musst ja den string auch noch in einen double umwandeln <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">// Dies ist eine Zeile aus deinem Listing
data[zeile.substr(0, found-1)] = zeile.substr(begin,length);

// Die kannst du umwandeln in
data[zeile.substr(0, found-1)] = makeDouble( zeile.substr(begin,length) );

// Und du musst du dir dann halt noch eine entsprechende Funktion basteln (irgendwo drüber):
double makeDouble( const string&amp; value )
{
    //... 
}
</code></pre>
<p>LadyM schrieb:</p>
<blockquote>
<p>Jedoch sollte die map je nachdem als &lt;string, int&gt; oder &lt;string, double&gt; oder &lt;string, string&gt; eingesetzt werden, also mit einem Template.</p>
<p>Wie muss ich denn das einbauen? Irgendwie komm ich da gerade nicht weiter...</p>
</blockquote>
<p><em>Sollst</em> du oder <em>willst</em> du? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Ich würde nämlich glatt sagen, das macht keinen Sinn, aber wenn du es machen <em>sollst</em>, bleibt dir ja nix anderes übrig..<br />
- Die Funktion &quot;read&quot; zur Templatefunktion machen<br />
- An entsprechenden Stellen &quot;string&quot; durch den Template-Parameter austauschen<br />
- Die &quot;makeDouble&quot;-Funktion irgendwie umbenennen und auch als Template-Funktion machen, mit stringstream lassen sich die Werte dann wunderbar in ein eigenes Format umwandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445523</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 29 Jan 2008 10:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 12:54:40 GMT]]></title><description><![CDATA[<p>Richtig, ich will nicht, ich soll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Brauch ich da unbedingt zusätzlich diese makeDouble-Funktion oder kann ich das nicht irgendwie alles in die read-Funktion schreiben?</p>
<p>Ich hab das mal so eingebaut, nur weiß ich nicht, wie ich das Template da jetzt genau einbauen muss...?</p>
<pre><code class="language-cpp">bool read() {
    map&lt;string, T&gt; data; // ???
    string::size_type found = string::npos;
    ifstream IN (&quot;test.txt&quot;);
    if (IN.is_open()) {
        string zeile;
        while (getline(IN, zeile)) {
            found = zeile.find_first_of(&quot;|&quot;);
            size_t begin = zeile.find_first_not_of(' ', found + 1);
            size_t end = zeile.find_first_of('|', found + 1);
            size_t length = end - begin;
            string result = zeile.substr(begin,length);
            stringstream sstr;
            T value; // ???
            sstr &lt;&lt; result;
            sstr &gt;&gt; value;
            data[zeile.substr(0, found-1)] = value;
        }
        IN.close();
        return true;
    } else {
        cout&lt;&lt;&quot;ERROR\n&quot;;
        return false;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1445625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445625</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Tue, 29 Jan 2008 12:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 12:56:53 GMT]]></title><description><![CDATA[<p>Perfekt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Jetzt noch ein &quot;template&lt;class T&gt;&quot; vor die Funktionsdeklaration &quot;bool read()&quot; und mit &quot;read&lt;double&gt;()&quot; oder &quot;read&lt;int&gt;()&quot; aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445628</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 29 Jan 2008 12:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 13:26:07 GMT]]></title><description><![CDATA[<p>OK, danke!</p>
<p>Jetzt aber noch ne letzte Frage... (hoff ich zumindest)</p>
<p>Diese read-Funktion steht ja in einer extra-Datei.<br />
Wenn ich jetzt in der main-Funktion folgenden Aufruf habe, erkennt er natürlich &quot;data&quot; nicht:</p>
<pre><code class="language-cpp">int main() {
    Test test();

    test.read&lt;double&gt;();
    double abc = data[&quot;ABC&quot;];

    return 0;
}
</code></pre>
<p>Bevor ich das Template eingefügt hatte, hab ich die map halt in die Klasse geschrieben und dann mit test.data[&quot;ABC&quot;] aufgerufen. Aber das funktioniert jetzt nicht mehr...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445644</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Tue, 29 Jan 2008 13:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 13:56:43 GMT]]></title><description><![CDATA[<p>Die Funktion könnte die map zurückgeben, oder du übergibst eine Referenz auf eine (leere) map als Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445661</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 29 Jan 2008 13:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Tue, 29 Jan 2008 20:36:56 GMT]]></title><description><![CDATA[<p>Es ist doch relativ sinnlos einen string aus einer Datei zu lesen, ihn anschließend wieder in einen stringstream zu schieben um dann einen anderen Typ zu lesen.<br />
Besser gleich den Typ aus der Datei zu lesen.</p>
<p>Eine read-Funktion, die eine map&lt; string, T &gt; aus einem beliebigen Input-Stream liest, könnte so aussehen:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
std::istream&amp; read( std::istream&amp; in, std::map&lt; std::string, T &gt;&amp; m ) 
{
    using namespace std;
    char pipe;
    for( std::pair&lt; string, T &gt; x
        ; (in &gt;&gt; x.first &gt;&gt; pipe &gt;&gt; x.second).ignore( numeric_limits&lt; streamsize &gt;::max(), '\n' ); )
    {
        if( pipe != '|' )
        {
            in.setstate( ios_base::failbit );
            return in;
        }
        if( !m.insert( x ).second )
            cerr &lt;&lt; &quot;Warnung: doppelter Eintrag - &quot; &lt;&lt; x.first &lt;&lt; endl;
    }
}
</code></pre>
<p>Das Format pro Eintrag ist &quot;Key-Wort | T Kommentar &lt;Zeilenende&gt;&quot;<br />
Key-Wort darf keine Space-Zeichen enthalten und zwischen dem Wort und dem Pipe-Zeichen muss immer mindestens ein Space stehen.</p>
<p>Deine vollständige read-Template-funktion oder Methode (?) wäre dann</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
bool read( std::map&lt; std::string, T &gt;&amp; m )
{
    ifstream IN (&quot;test.txt&quot;);
    if (IN.is_open()) {
        read( IN, m );
        return true;
    }
    cout&lt;&lt;&quot;ERROR\n&quot;;
    return false;
}
</code></pre>
<p>d.h. beim Aufruf übergist Du einfach die map Deiner Wahl, dann erkennt der Compiler auch, was er zu tun hat.</p>
<p>LadyM schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main() {
    Test test();

    test.read&lt;double&gt;();
    double abc = data[&quot;ABC&quot;];

    return 0;
}
</code></pre>
</blockquote>
<p>Ich meine es muss</p>
<pre><code class="language-cpp">Test test;
</code></pre>
<p>heißen, sonst hält der Compiler dies für einen Funktions-Prototypen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445963</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 29 Jan 2008 20:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Fri, 01 Feb 2008 09:15:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erstmal danke für Eure Hilfe.<br />
Ich hab das inzwischen mit dem Code von Werner probiert und es funktioniert eigentlich auch, es sei denn, die Datei sieht so aus:</p>
<pre><code>ABC | 1.23 | Kommentar 1
DEF | Hier_steht_ein_Text | Kommentar 2
GHI | 4.56 | Kommentar 3
</code></pre>
<p>Jetzt kann ich zwar auf die 1.23 noch zugreifen, aber für GHI wird mir 0 und nicht 4.56 ausgegeben.</p>
<p>Könnt Ihr mir vielleicht sagen, wie ich das noch lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447428</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Fri, 01 Feb 2008 09:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Fri, 01 Feb 2008 15:10:59 GMT]]></title><description><![CDATA[<p>LadyM schrieb:</p>
<blockquote>
<p>... es funktioniert eigentlich auch, es sei denn, die Datei sieht so aus:</p>
<pre><code>ABC | 1.23 | Kommentar 1
DEF | Hier_steht_ein_Text | Kommentar 2
GHI | 4.56 | Kommentar 3
</code></pre>
<p>Jetzt kann ich zwar auf die 1.23 noch zugreifen, aber für GHI wird mir 0 und nicht 4.56 ausgegeben.</p>
</blockquote>
<p>Ich unterstelle mal, dass dies genau dann passiert, wenn die map test::data (?) den Typ std::map&lt; std::string, double &gt; hat. Dann läuft die Funktion ab der Stelle wo statt einer Zahl 'Hier_steht_ein_Text' steht auf einen Fehler und danach wird gar nichts mehr eingelesen.<br />
Wenn man jetzt die map mit dem operator[] nach &quot;GHI&quot; fragt ..</p>
<pre><code class="language-cpp">double was_ist = test::data[&quot;GHI&quot;];
</code></pre>
<p>.. dann existierte vorher kein Eintrag für &quot;GHI&quot;, und daher wird Dir hier der Default-Wert für ein double - und das ist die 0. - zurückgeliefert.</p>
<p>Ich rate mal, dass Du die Datei nicht verändern willst/kannst und dass Du letztlich nur die Einträge benötigst, welche auch wirklich Zahlen enthalten. - mal unter uns, das ist aber ein komisches Format!</p>
<p>Ok - eine Lösung wäre ein Manipulator, der die Unterscheidung zwischen double und kein double während des Einlesens erledigt. Einzufügen in Zeile 7 in meinem ersten Code-Posting (Funktion read( .., map )) - beim Einlesen von x.second. Details kann ich Dir frühestens morgen sagen - ich habe jetzt keine Zeit.</p>
<p>Kannst Du mir derweil noch sagen, was das für double sind - also was bedeuten sie ? .. und was bedeutet dann das 'Hier_steht_ein_Text' in diesem Zusammenhang?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447654</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 01 Feb 2008 15:10:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Sat, 02 Feb 2008 09:41:22 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Ich unterstelle mal, dass dies genau dann passiert, wenn die map test::data (?) den Typ std::map&lt; std::string, double &gt; hat. Dann läuft die Funktion ab der Stelle wo statt einer Zahl 'Hier_steht_ein_Text' steht auf einen Fehler und danach wird gar nichts mehr eingelesen.<br />
Wenn man jetzt die map mit dem operator[] nach &quot;GHI&quot; fragt ..</p>
<pre><code class="language-cpp">double was_ist = test::data[&quot;GHI&quot;];
</code></pre>
<p>.. dann existierte vorher kein Eintrag für &quot;GHI&quot;, und daher wird Dir hier der Default-Wert für ein double - und das ist die 0. - zurückgeliefert.</p>
</blockquote>
<p>Genauso ist es!</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Ich rate mal, dass Du die Datei nicht verändern willst/kannst und dass Du letztlich nur die Einträge benötigst, welche auch wirklich Zahlen enthalten. - mal unter uns, das ist aber ein komisches Format!</p>
</blockquote>
<p>Richtig, die Datei darf nicht verändert werden und im Normalfall benötigt man nur die Zahlen, höchstens zu Informationszwecken werden irgendwann die Strings eingelesen. Ja, das Format ist etwas gewöhnungsbedürftig, aber es gibt zwei Arten von Dateien und die zweite ist sogar noch schlimmer, mit der komm ich überhaupt nicht klar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Ok - eine Lösung wäre ein Manipulator, der die Unterscheidung zwischen double und kein double während des Einlesens erledigt. Einzufügen in Zeile 7 in meinem ersten Code-Posting (Funktion read( .., map )) - beim Einlesen von x.second. Details kann ich Dir frühestens morgen sagen - ich habe jetzt keine Zeit.</p>
</blockquote>
<p>Das wär echt super, wenn Du mir da noch ein bißchen weiterhelfen könntest...</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Kannst Du mir derweil noch sagen, was das für double sind - also was bedeuten sie ? .. und was bedeutet dann das 'Hier_steht_ein_Text' in diesem Zusammenhang?</p>
</blockquote>
<p>Die Datei war so nur ein Ausschnitt. Komplett sieht die Datei immer folgendermaßen aus (inklusive der Leerzeile):</p>
<pre><code>ABC | PROJEKT_NAME | Kommentar
DEF | PROJEKT_TYP | Kommentar
GHI | ZUSATZTEXT |

JKL | 123.4000000e+00 | Kommentar was die Variable bedeutet
MNO | 5.67000000e+03 | Kommentar was die Variable bedeutet
PQR | 8.9000000e-01 | Kommentar was die Variable bedeutet
STU | VERZEICHNIS/VERZEICHNIS/DATEIPFAD1| Kommentar
VWX | VERZEICHNIS/VERZEICHNIS/DATEIPFAD2| Kommentar
</code></pre>
<p>Für jedes Projekt gibt es eine solche Datei, in der die wichtigen Referenzparameter stehen. Die werden ausgelesen und dann mit ihnen weitergerechnet. Die Strings enthalten z.B. den Projektnamen oder einen Dateipfad. Bei den Variablen kann es jetzt z.B. noch vorkommen, dass da ein Integerwert steht.</p>
<p>Ich hoffe, dass Dir diese Informationen weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447945</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Sat, 02 Feb 2008 09:41:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte in eine map einlesen on Sat, 02 Feb 2008 17:15:26 GMT]]></title><description><![CDATA[<p>LadyM schrieb:</p>
<blockquote>
<p>Richtig, die Datei darf nicht verändert werden und im Normalfall benötigt man nur die Zahlen, höchstens zu Informationszwecken werden irgendwann die Strings eingelesen.</p>
</blockquote>
<p>Ok - dann sollte man vielleicht doch immer alles lesen und beim Typ double eine Sonderbehandlung einbauen.<br />
Die Schwierigkeit besteht auch noch darin, dass das ja mit dem Template auch noch funktionieren soll. Wenn Du die Werte als string liest, soll das folgende Wort sicher korrekt gelesen werden. Das ist nicht einfach, aber es gibt für alles eine Lösung.</p>
<p>Zunächst führe ich den schon erwähnten Manipulator ein und rufe ihn in der read-Funktion auf.</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
T&amp; robust( T&amp; x )
{
    return x;   // default: tue nichts
}

template&lt; typename T &gt;
std::istream&amp; read( std::istream&amp; in, std::map&lt; std::string, T &gt;&amp; m ) 
{
    using namespace std;
    char pipe;
    for( std::pair&lt; string, T &gt; x
        ; (in &gt;&gt; x.first &gt;&gt; pipe &gt;&gt; robust( x.second )).ignore( numeric_limits&lt; streamsize &gt;::max(), '\n' ); )
    {
        if( pipe != '|' )
        {
            in.setstate( ios_base::failbit );
            return in;
        }
        if( !m.insert( x ).second )
            cerr &lt;&lt; &quot;Warnung: doppelter Eintrag - &quot; &lt;&lt; x.first &lt;&lt; endl;
    }
    return in;
}
</code></pre>
<p>Für den Datentyp double führt man eine Sonderbehandlung ein</p>
<pre><code class="language-cpp">struct DblReader
{
    explicit DblReader( double&amp; x ) : m_x( x ) {}
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, const DblReader&amp; r )
    {
        if( check_on_number( in ) ) 
            return in &gt;&gt; r.m_x; // nur Lesen, wenn auch eine Zahl folgt
        if( in )
            r.m_x = 0.0;    // falls kein Lesefehler, double definiert zu 0 setzen
        return in;
    }
private:
    double&amp; m_x;
};
DblReader robust( double&amp; d )
{
    return DblReader( d );
}
</code></pre>
<p>Das hier benutzte 'check_on_number' sieht so aus:</p>
<pre><code class="language-cpp">// --   liefert true, falls eine Ziffer oder ein Vorzeichen folgt
bool check_on_number( std::istream&amp; in )
{
    if( (in &gt;&gt; std::ws).good() )
    {
        const char c = in.peek();
        const std::ctype&lt; char &gt;&amp; ct = std::use_facet&lt; std::ctype&lt; char &gt; &gt;( in.getloc() );
        if( ct.is( std::ctype_base::digit, c ) || c == '-' || c == '+'  )
            return true;
    }
    return false;
}
</code></pre>
<p>das sollte jetzt sowohl bei double als auch beim Typ string funktionieren. Die Einträge der Nicht-Zahlenwerte werden in die map eingetragen, aber auf 0 gesetzt.</p>
<p>Falls in einem Eintrag ein int steht, das heißt eine Zahl ohne Dezimalpunkt, so ist das kein Problem.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448129</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 02 Feb 2008 17:15:26 GMT</pubDate></item></channel></rss>