<?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[Fragen zu std::istringstream]]></title><description><![CDATA[<p>Hallo.<br />
Ich bin noch recht neu in C++ und haette da einige Fragen zur Umwandlung eines Strings in eine Zahl.</p>
<p>Ich weiss, dass ich eine Zahl aus einem String per std::istringstream lesen kann.</p>
<pre><code class="language-cpp">std::string s(&quot;999999999&quot;);  // 999.999.999
	std::istringstream ss(s);

	int i;
	ss &gt;&gt; i;

	std::cout &lt;&lt; i;
</code></pre>
<p>Dieser Code funktioniert nicht mehr, da die Zahl wohl zu gross ist:</p>
<pre><code class="language-cpp">std::string s(&quot;9999999999&quot;);  // 9.999.999.999
	std::istringstream ss(s);

	int i;
	ss &gt;&gt; i;

	std::cout &lt;&lt; i;
</code></pre>
<p>Als Ergebnis erhalte ich hier &quot;-858993460&quot;. Bedeutet das, dass es hier einen Ueberlauf gab? Wie kann ich das pruefen?</p>
<p>Gibt es eine Moeglichkeit zu pruefen welcher Datentyp fuer die Konvertierung am besten geeignet waere?</p>
<p>Wie kann ich pruefen, ob eine Konvertierung fehlschlag und was genau die Ursache dafuer war? (z.B. wegen eines ungueltigen Zeichens)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296027/fragen-zu-std-istringstream</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 05:15:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296027.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Nov 2011 15:16:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 15:16:53 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Ich bin noch recht neu in C++ und haette da einige Fragen zur Umwandlung eines Strings in eine Zahl.</p>
<p>Ich weiss, dass ich eine Zahl aus einem String per std::istringstream lesen kann.</p>
<pre><code class="language-cpp">std::string s(&quot;999999999&quot;);  // 999.999.999
	std::istringstream ss(s);

	int i;
	ss &gt;&gt; i;

	std::cout &lt;&lt; i;
</code></pre>
<p>Dieser Code funktioniert nicht mehr, da die Zahl wohl zu gross ist:</p>
<pre><code class="language-cpp">std::string s(&quot;9999999999&quot;);  // 9.999.999.999
	std::istringstream ss(s);

	int i;
	ss &gt;&gt; i;

	std::cout &lt;&lt; i;
</code></pre>
<p>Als Ergebnis erhalte ich hier &quot;-858993460&quot;. Bedeutet das, dass es hier einen Ueberlauf gab? Wie kann ich das pruefen?</p>
<p>Gibt es eine Moeglichkeit zu pruefen welcher Datentyp fuer die Konvertierung am besten geeignet waere?</p>
<p>Wie kann ich pruefen, ob eine Konvertierung fehlschlag und was genau die Ursache dafuer war? (z.B. wegen eines ungueltigen Zeichens)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149212</guid><dc:creator><![CDATA[StringToNumber]]></dc:creator><pubDate>Sat, 26 Nov 2011 15:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 18:44:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Bedeutet das, dass es hier einen Ueberlauf gab?</p>
</blockquote>
<p>Nein. Das Ergebnis einer solchen Operation ist undefiniert (? Der Standard ist ein bisschen unklar an der Stelle). Bei meiner Implementierung kommt beispielsweise INT_MAX dabei heraus.</p>
<blockquote>
<p>Wie kann ich das pruefen?</p>
</blockquote>
<p>Wenn das Lesen fehlschlägt, weil die Zahl zu groß/klein für den Datentyp ist, wird das failbit des Streams gesetzt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Ich schreibe bewusst ganz allgemein &quot;Stream&quot; anstatt istringstream, denn alle Streams verhalten sich gleich. Alles was du hier lernst, kannst du auch auf alle anderen Streamobjekte anwenden.</p>
<blockquote>
<p>Gibt es eine Moeglichkeit zu pruefen welcher Datentyp fuer die Konvertierung am besten geeignet waere?</p>
</blockquote>
<p>Und was wurdest du machen, wenn du es wüsstest? Worauf willst du hinaus?</p>
<blockquote>
<p>Wie kann ich pruefen, ob eine Konvertierung fehlschlag und was genau die Ursache dafuer war?</p>
</blockquote>
<p>Die Streams haben verschiedene Fehlerflags, guck sie dir mal an:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios_base/iostate/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios_base/iostate/</a><br />
Was die genaue Ursache war ist ein bisschen haariger rauszufinden. Eigentlich gar nicht so wirklich. Du müsstest schon vorher die Daten komplett aus dem Stream lesen, irgendwo speichern und diese dann in einen anderen Stream stopfen, aus diesem lesen und im Fehlerfall kannst du dann in den Originaldaten nach der Ursache suchen. Wieder die Frage: Was würde es dir denn nützen? Reicht es nicht zu wissen, dass ein Fehler aufgetreten ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149305</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 26 Nov 2011 18:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 19:19:42 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>Bedeutet das, dass es hier einen Ueberlauf gab?</p>
</blockquote>
<p>Nein. Das Ergebnis einer solchen Operation ist undefiniert (? Der Standard ist ein bisschen unklar an der Stelle). Bei meiner Implementierung kommt beispielsweise INT_MAX dabei heraus.</p>
</blockquote>
<blockquote>
<p>22.4.2.1.2 num_get virtual functions [facet.num.get.virtuals]<br />
:::<br />
Stage 3: The sequence of chars accumulated in stage 2 (the field) is converted to a numeric value by the rules of one of the functions declared in the header &lt;cstdlib&gt;:<br />
— For a signed integer value, the function strtoll.<br />
— For an unsigned integer value, the function strtoull.<br />
— For a floating-point value, the function strtold.<br />
The numeric value to be stored can be one of:<br />
— zero, if the conversion function fails to convert the entire field. ios_base::failbit is assigned to err.<br />
— the most positive representable value, if the field represents a value too large positive to be represented in val. ios_base::failbit is assigned to err.<br />
— the most negative representable value or zero for an unsigned integer type, if the field represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.<br />
— the converted value, otherwise.<br />
The resultant numeric value is stored in val.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2149320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149320</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 26 Nov 2011 19:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 19:30:23 GMT]]></title><description><![CDATA[<p>Falls du größere zahlen erlauben willst, dann kannst du auch statt int ein long long nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149325</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Sat, 26 Nov 2011 19:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 19:44:49 GMT]]></title><description><![CDATA[<p>Interessant. Wie würdest du dann die Konvertierung die in Kapitel 27.6.1.2.2 damit in Verbindung bringen? Das ist die Stelle auf die ich mich bezog und ich finde das ganze Kapitel etwas undeutlich geschrieben.</p>
<p>Die von dir zitierte Stelle würde natürlich auch bedeuten, dass die Standardbibliothek des Threaderstellers hier nicht standardkonform ist. Kurzes Googlen ergibt, dass -858993460 == 0xcccccccc und dies wohl ein üblicher Fehlerwert bei Microsoft ist.</p>
<p>edit: Meine Kapitelnummern sind noch aus C++98, deine offensichtlich C++11 (da es 22.4 in C++98 gar nicht gibt). In C++11 ist das Kapitel auf das ich mich bezog nun ziemlich eindeutig. Der Wert hat min bzw. max zu sein (oder das richtige Ergebnis, wenn es passt). Frage hat sich somit erledigt, den 0xcccccccc kann man dann meinetwegen auf die undeutliche Formulierung in C++98 schieben.</p>
<p>edit: Für die, die es interessiert:<br />
C++98, <code>operator &gt;&gt;( short &amp; val )</code> :</p>
<pre><code class="language-cpp">typedef num_get &lt; charT , istreambuf_iterator &lt; charT , traits &gt; &gt; numget ;
 iostate err = 0;
 long lval ;
 use_facet &lt; numget &gt;( loc ). get (* this , 0 , * this , err , lval );
 if ( err == 0)
    &amp;&amp; ( lval &lt; numeric_limits &lt; short &gt;:: min ()
             || numeric_limits &lt; short &gt;:: max () &lt; lval ))
    err = ios_base :: failbit ;
 setstate ( err );
</code></pre>
<p>C++11:</p>
<pre><code class="language-cpp">typedef num_get&lt;charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
 iostate err = ios_base::goodbit;
 long lval;
 use_facet&lt;numget&gt;(loc).get(*this, 0, *this, err, lval);
 if (lval &lt; numeric_limits&lt;short&gt;::min()) {
   err |= ios_base::failbit;
   val = numeric_limits&lt;short&gt;::min();
 } else if (numeric_limits&lt;short&gt;::max() &lt; lval) {
   err |= ios_base::failbit;
   val = numeric_limits&lt;short&gt;::max();
 } else
   val = static_cast&lt;short&gt;(lval);
 setstate(err);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2149327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149327</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 26 Nov 2011 19:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 19:40:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Interessant. Wie würdest du dann die Konvertierung die in Kapitel 27.6.1.2.2 damit in Verbindung bringen? Das ist die Stelle auf die ich mich bezog und ich finde das ganze Kapitel etwas undeutlich geschrieben.</p>
<p>Die von dir zitierte Stelle würde natürlich auch bedeuten, dass die Standardbibliothek des Threaderstellers hier nicht standardkonform ist. Kurzes Googlen ergibt, dass -858993460 == 0xcccccccc und dies wohl ein üblicher Fehlerwert bei Microsoft ist.</p>
</blockquote>
<p>Wie üblich bezog ich mich auf den neuen Standard.<br />
In C++03 ist die Konvertierung durch num_get über scanf definiert, damit folgt dort undefiniertes Verhalten für zu große oder zu kleine Werte (C99 7.19.6.2/10).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149332</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 26 Nov 2011 19:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu std::istringstream on Sat, 26 Nov 2011 19:46:17 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wie üblich bezog ich mich auf den neuen Standard.<br />
In C++03 ist die Konvertierung durch num_get über scanf definiert, damit folgt dort undefiniertes Verhalten für zu große oder zu kleine Werte (C99 7.19.6.2/10).</p>
</blockquote>
<p>Joah, hab's bemerkt. Siehe meinen Beitrag oben, der in der Zwischenzeit reichlich länger geworden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149334</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 26 Nov 2011 19:46:17 GMT</pubDate></item></channel></rss>