<?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 aus String lesen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Zeile als String vorliegen:</p>
<pre><code>string line = A_BC | 1.23 | Irgendein Text
</code></pre>
<p>Nun möchte ich sowohl das A_BC als auch das 1.23 als String bzw. Double aus der Zeile auslesen. Dafür habe ich folgendes geschrieben, was soweit auch funktioniert:</p>
<pre><code class="language-cpp">string::size_type found = string::npos;
found = line.find_first_of('|');
size_t begin = line.find_first_not_of(' ', found+1);
size_t end = line.find_first_of('|', found+1);
size_t length = end - begin;
string s = line.substr(0, found-1);
double d;
sstr &lt;&lt; line.substr(begin, length);
sstr &gt;&gt; d;
</code></pre>
<p>Jetzt kann es allerdings vorkommen, dass nach dem A_BC mehrere Leerzeichen stehen und dann funktioniert es nicht mehr. Also hab ich es folgendermaßen umgeschrieben:</p>
<pre><code class="language-cpp">stringstream sstr(line);
char pipe;
string s;
double d;
sstr &gt;&gt; s &gt;&gt; pipe &gt;&gt; d;
</code></pre>
<p>So würde es eigentlich schon funktionieren, allerdings hab ich jetzt gesehen, dass der Double-Wert auch ein String sein kann (und zwar bestehend aus mehreren Worten, durch Leerzeichen getrennt).<br />
Jetzt wird allerdings immer nur das 1. Wort eingelesen. Ich dachte eigentlich, dass das mit der 1. Variante funktionieren sollte, aber dem ist nicht so.</p>
<p>Könnt Ihr mir vielleicht helfen, wie ich das mit diesen 2 Sonderfällen in eine Funktion reinbekomme?<br />
Vielleicht (nein bestimmt) kann man das Ganze insgesamt irgendwie schöner lösen? Bin für jeden Tipp dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207122/problem-werte-aus-string-lesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 01:28:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207122.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Mar 2008 07:58:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Tue, 04 Mar 2008 07:58:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Zeile als String vorliegen:</p>
<pre><code>string line = A_BC | 1.23 | Irgendein Text
</code></pre>
<p>Nun möchte ich sowohl das A_BC als auch das 1.23 als String bzw. Double aus der Zeile auslesen. Dafür habe ich folgendes geschrieben, was soweit auch funktioniert:</p>
<pre><code class="language-cpp">string::size_type found = string::npos;
found = line.find_first_of('|');
size_t begin = line.find_first_not_of(' ', found+1);
size_t end = line.find_first_of('|', found+1);
size_t length = end - begin;
string s = line.substr(0, found-1);
double d;
sstr &lt;&lt; line.substr(begin, length);
sstr &gt;&gt; d;
</code></pre>
<p>Jetzt kann es allerdings vorkommen, dass nach dem A_BC mehrere Leerzeichen stehen und dann funktioniert es nicht mehr. Also hab ich es folgendermaßen umgeschrieben:</p>
<pre><code class="language-cpp">stringstream sstr(line);
char pipe;
string s;
double d;
sstr &gt;&gt; s &gt;&gt; pipe &gt;&gt; d;
</code></pre>
<p>So würde es eigentlich schon funktionieren, allerdings hab ich jetzt gesehen, dass der Double-Wert auch ein String sein kann (und zwar bestehend aus mehreren Worten, durch Leerzeichen getrennt).<br />
Jetzt wird allerdings immer nur das 1. Wort eingelesen. Ich dachte eigentlich, dass das mit der 1. Variante funktionieren sollte, aber dem ist nicht so.</p>
<p>Könnt Ihr mir vielleicht helfen, wie ich das mit diesen 2 Sonderfällen in eine Funktion reinbekomme?<br />
Vielleicht (nein bestimmt) kann man das Ganze insgesamt irgendwie schöner lösen? Bin für jeden Tipp dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467715</guid><dc:creator><![CDATA[LadyM]]></dc:creator><pubDate>Tue, 04 Mar 2008 07:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Tue, 04 Mar 2008 10:44:26 GMT]]></title><description><![CDATA[<p>Ich rate Dir davon ab, das ganz in genau eine Funktion pressen zu wollen. Du hast hier mehrere Problemstellungen (jede möglich Repräsentation einer Datenzeile entspricht einer weiteren Problemstellung - genauer, deren Interpretierung):</p>
<p><em>Die Formalregeln habe ich noch aus Deinen vorherigen Threads im Kopf und fasse diese hier zusammen (korrigiere mich, wenn ich daneben liege).</em></p>
<p>Aufbau (Format) eines Datensatzes (Zeile) innerhalb der Textdatei:</p>
<pre><code>(Schlüssel) &quot;|&quot; (Wert) [&quot;|&quot; (Kommentar)]
</code></pre>
<p>A. Wobei gilt:<br />
1. Dem Pipe-Zeichen (&quot;|&quot;) darf eine beliebige Anzahl Leerzeichen vorausgehen oder folgen.<br />
2. Der Zeile darf eine beliebige Anzahl Leerzeichen vorausgehen oder folgen.<br />
3. Der Kommentar ist (wie oben dargestellt) nebst vorausgehendem Pipe-Zeichen optional.</p>
<p>B. Ferner gilt:<br />
1. 'Wert' kann eine &quot;normale&quot; Zeichenkette sein oder<br />
2. ein Literal einer Fließkommazahl sein.</p>
<p>Dein <strong>erstes Problem</strong> ist nun, aus einer eingelesenen Zeile, die drei Komponenten Schlüssel, Wert und Kommentar herauszusondern. Du benötigst eine Funktion, welche <strong>eine Zeile</strong> (== Zeichenkette / std::string) annimmt und drei Zeichenketten zurückgibt:</p>
<pre><code class="language-cpp">// Struktur des Datensatzes
struct Datensatz
{
    std::string schluessel;
    std::string wert;
    std::string kommentar;
};

// Funktionsprototyp
Datensatz zeile_aufteilen(const std::string&amp; zeile);
</code></pre>
<p>In der Funktionsdefinition musst Du die Formalregeln für den einzelnen Datensatz und die Zusatzbedingungen (<em>A</em>) berücksichtigen. Welchen Inhalt 'Wert' bis zu diesem Zeitpunkt hat (ob nun &quot;normaler Text&quot;, Fließkommazahl oder Käsekuchen) ist unerheblich, da es ein weiteres Problem darstellt.</p>
<p>Dein <strong>zweites Problem</strong> ist es, den Wert zu interpretieren. Das spar ich mir im Moment aus. Erstmal sollte das erste Problem angegangen werden.</p>
<p>Grüße... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467821</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 04 Mar 2008 10:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Tue, 04 Mar 2008 11:07:41 GMT]]></title><description><![CDATA[<p>LadyM schrieb:</p>
<blockquote>
<p>Könnt Ihr mir vielleicht helfen, wie ich das mit diesen 2 Sonderfällen in eine Funktion reinbekomme?<br />
Vielleicht (nein bestimmt) kann man das Ganze insgesamt irgendwie schöner lösen? Bin für jeden Tipp dankbar!</p>
</blockquote>
<p>ja - den Tipp hast Du schon bekommen - und zwar <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-203927-and-postdays-is-0-and-postorder-is-asc-and-start-is-13.html" rel="nofollow">am 2.Feb. in diesem Beitrag</a>. Hast Du dazu noch Fragen?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467838</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 04 Mar 2008 11:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Tue, 04 Mar 2008 13:35:21 GMT]]></title><description><![CDATA[<p>LadyM schrieb:</p>
<blockquote>
<p>So würde es eigentlich schon funktionieren, allerdings hab ich jetzt gesehen, dass der Double-Wert auch ein String sein kann (und zwar bestehend aus mehreren Worten, durch Leerzeichen getrennt).</p>
</blockquote>
<p>&quot;123 456&quot; sind entweder zwei zahlen, eine fehlerhafte eingabe, oder du löscht die leerzeichen dazwischen und machst daraus &quot;123456&quot;</p>
<p>&quot;123 456 789&quot; sind entweder drei zahlen, eine fehlerhafte eingabe, oder du löscht die leerzeichen dazwischen und machst daraus &quot;123456789&quot;<br />
usw.<br />
<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/1468001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468001</guid><dc:creator><![CDATA[ajooo]]></dc:creator><pubDate>Tue, 04 Mar 2008 13:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Wed, 05 Mar 2008 15:12:52 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>LadyM schrieb:</p>
<blockquote>
<p>Könnt Ihr mir vielleicht helfen, wie ich das mit diesen 2 Sonderfällen in eine Funktion reinbekomme?<br />
Vielleicht (nein bestimmt) kann man das Ganze insgesamt irgendwie schöner lösen? Bin für jeden Tipp dankbar!</p>
</blockquote>
<p>ja - den Tipp hast Du schon bekommen - und zwar <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-203927-and-postdays-is-0-and-postorder-is-asc-and-start-is-13.html" rel="nofollow">am 2.Feb. in diesem Beitrag</a>. Hast Du dazu noch Fragen?</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<p>Hallo Werner,</p>
<p>du kannst von dir nicht auf andere schließen. <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>Wenn Sie das Ihrem Lehrer oder Professor zeigt, dann wird er mit gezielten Fragen feststellen, dass der Code von dir kommt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ich habe das Programm mal laufen lassen. Ich verstehe zwar, dass es immer zur Abbruchbedingung kommt, aber wie könnte ich das Warning wegbekommen?</p>
<pre><code>warning C4715: 'read&lt;double&gt;' : not all control paths return a value
</code></pre>
<p>Gruß<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468840</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Wed, 05 Mar 2008 15:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Wed, 05 Mar 2008 15:26:54 GMT]]></title><description><![CDATA[<p>Hm, ich habe mich geirrt, die return Anweisung wird überhaupt nicht ausgeführt.</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>Werner Salomon schrieb:</p>
<blockquote>
<p>Hast Du dazu noch Fragen?</p>
</blockquote>
<p>Auch wenn du mit dem <strong>Du</strong> nicht mich meinst <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="😉"
    /> stelle ich mal meine Frage.</p>
<p>Was passiert in dieser Bedingung?</p>
<pre><code class="language-cpp">(in &gt;&gt; x.first &gt;&gt; pipe &gt;&gt; x.second).ignore( numeric_limits&lt; streamsize &gt;::max(), '\n' );
</code></pre>
<p>Ich versuche mal soweit es zu erklären wie ich es verstehe. Der Instream schreibt in x.first, pipe und x.second. Der ganze Ausdruck ist geklammert. Aber dann. Auf was wird nun das .ignore ausgeführt? Was erreicht du mit der Parameterliste? Anscheinend ist diese Bedignung falsch, wenn das Testdatei so aussieht:</p>
<blockquote>
<p>ABC | 1.23 | Kommentar1\n<br />
DEF | 4.56 | Kommentar2\n<br />
GHI | 7.89 | Kommentar3\n</p>
</blockquote>
<p>Wieso?</p>
<p>Gruß<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468847</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Wed, 05 Mar 2008 15:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Wed, 05 Mar 2008 16:15:49 GMT]]></title><description><![CDATA[<p>Och das ist doch einfach <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="😉"
    /><br />
Also bei der read fehlt ein return in; am Ende ...</p>
<p>Was die Zeile macht? Naja es wird <strong>erst</strong> die Klammer ausgeführt, d.h. x.first wird ausgelesen, trennzeichen eingelesen und dann x.second ausgelesen. Soweit war es dir ja klar. operator&gt;&gt; eines std::istream gibt eine Referenz auf sich selber zurück (was auch bsw. std::cout &lt;&lt; 10 &lt;&lt; &quot;AUTO!&quot;; usw. möglich macht!).</p>
<pre><code class="language-cpp">in &gt;&gt; x.first &gt;&gt; pipe &gt;&gt; x.second;
in.ignore( numeric_limits&lt; streamsize &gt;::max(), '\n' );
</code></pre>
<p>wäre also das selbe!</p>
<p>Nun gibt ignore auch wieder eine Referenz auf in zurück. Diese wird dann per operator void* auf NULL getestet und somit getestet, ob ein Fehler beim einlesen aufgetreten ist <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/1468884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468884</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 05 Mar 2008 16:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Werte aus String lesen on Fri, 07 Mar 2008 11:15:37 GMT]]></title><description><![CDATA[<p>Hi (D)evil,</p>
<p>(D)Evil schrieb:</p>
<blockquote>
<p>Diese wird dann per operator void* auf NULL getestet</p>
</blockquote>
<p>Wo wird den mit operator void* auf NULL gestestet? Das verstehe ich nicht.</p>
<p>Gruß<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469914</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Fri, 07 Mar 2008 11:15:37 GMT</pubDate></item></channel></rss>