<?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[uint8_t korrekt von istream lesen]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wie kann man einen uint8_t korrekt von einem std::istream formatiert lesen, sodass im Fehlerfall alle Zeichen im Stream bleiben?</p>
<p>Grüße,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302424/uint8_t-korrekt-von-istream-lesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 07:43:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302424.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Apr 2012 11:48:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 11:53:40 GMT]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wie kann man einen uint8_t korrekt von einem std::istream formatiert lesen, sodass im Fehlerfall alle Zeichen im Stream bleiben?</p>
<p>Grüße,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203222</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Apr 2012 11:53:40 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 11:53:33 GMT]]></title><description><![CDATA[<p>Damit wir uns richtig verstehen: Mit den Zeichen, die nicht übergangen werden sollen, meinst du eventuelle führende Whitespaces?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203227</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 18 Apr 2012 11:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 12:01:02 GMT]]></title><description><![CDATA[<p>Nein. Wenn ich den hier mache, ...</p>
<pre><code class="language-cpp">uint8_t i;
is &gt;&gt; i;
</code></pre>
<p>... wird nur ein einzelnes Zeichen eingelesen, da uint8_t nur wohl nur ein Typedef für unsigned char ist. Ich möchte aber einen Zahlenwert im Bereich 0-255 formatiert einlesen.<br />
<a href="http://ideone.com/F4Lru" rel="nofollow">http://ideone.com/F4Lru</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203229</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Apr 2012 12:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 12:23:56 GMT]]></title><description><![CDATA[<p>In der Form wirst Du das nur über eine Wrapperklasse hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203243</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 18 Apr 2012 12:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 12:41:54 GMT]]></title><description><![CDATA[<p>Ich würde den Umweg über int machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203251</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 18 Apr 2012 12:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 12:44:53 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Ich würde den Umweg über int machen.</p>
</blockquote>
<p>Das konsumiert Dir aber u.U. zu viele Zeichen aus dem Stream.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203252</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 18 Apr 2012 12:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 18:29:18 GMT]]></title><description><![CDATA[<p>Ungefähr so?</p>
<pre><code class="language-cpp">template&lt; typename T &gt; void readNumeric( std::istream &amp;stream, T&amp; val )
{
	val = T();

	const T compareMax = std::numeric_limits&lt; T &gt;::max() / 10;
	const T lastDigitMax = std::numeric_limits&lt; T &gt;::max() % 10;

	int sign = 0;

	while( true )
	{
		int c = stream.peek();

		if( !stream.good() )
		{ return; }

		switch( c )
		{
		case '+':
			//already read an algebraic sign
			if( sign != 0 )
			{ return; }

			sign = 1;
			break;

		case '-':
			if( ( sign != 0 ) ||						//already read an algebraic sign
				!std::numeric_limits&lt; T &gt;::is_signed )	//type is unsigned
			{ return; }

			sign = -1;
			break;

		default:
			if( !isdigit( c ) )
			{ return; }

			c -= '0';

			//Adding another digit would result in an overflow -&gt; break
			if( val &gt; compareMax )
			{ return; }

			//Adding another digit might result in an overflow
			if( ( val == compareMax ) &amp;&amp; ( c &gt; lastDigitMax ) )
			{
				//If a minus sign was read...
				if( sign == -1 )
				{
					//...the last digit is allowed to be lastDigitMax + 1
					if( c == ( lastDigitMax + 1 ) )
					{
						//Reached the minium!
						val = std::numeric_limits&lt; T &gt;::min();
						stream.get();
					}
					else
					{ val *= -1; }
				}
				return;
			}

			val = val * 10 + c;

			break;
		}

		stream.get();
	}

	if( sign == -1 )
	{ val *= sign; }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2203387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203387</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 18 Apr 2012 18:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 18:32:23 GMT]]></title><description><![CDATA[<p>So, jetzt noch die locales und alle Zahlenformatmanipulatoren unterstützen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2203388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203388</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 18 Apr 2012 18:32:23 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Wed, 18 Apr 2012 20:33:25 GMT]]></title><description><![CDATA[<p>Könntest du nicht einfach einen Wrapper mit Einlese-Operator schreiben, der einen short einliest und dann was wirft, falls die Zahl nicht im richtigen range ist? (Also wie von Ethon vorgeschlagen)? Und wenn Tachyons Einwand, dann einfach nacheinander Drei Zeichen aus dem Stream lesen, in einen Stringstream schieben und von da streamen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203418</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 18 Apr 2012 20:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 06:49:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;

int main()
{
    std::stringstream ss(&quot;123456789012345678901234567890&quot;);

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

    std::cout &lt;&lt; ss.rdbuf();
}
</code></pre>
<p>Das hier liest auch alle Zahlen ein. Also verstehe ich immer noch nicht, was das Problem ist, einfach int zu verwenden und den Wert einem uint8_t zuzuweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203485</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 19 Apr 2012 06:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 06:55:51 GMT]]></title><description><![CDATA[<p>Und was machst du, wenn bei der Konvertierung in einen uint8_t ein Overflow auftreten würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203490</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 19 Apr 2012 06:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 07:20:20 GMT]]></title><description><![CDATA[<p>Das könnte man ja nach dem Einlesen abfangen. Im Normalfall muss man Input sowieso selbst verifizieren, dazu sind die Stream wirklich nicht gedacht. Wenn ich einen uint8_t einlese, habe ich eine ungefähre Ahnung wie der genaue Wertebereich aussehen sollte. Wenn genau 0-255 zulässig ist, dann ist das imho ein Spezialfall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203499</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 19 Apr 2012 07:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 07:41:57 GMT]]></title><description><![CDATA[<p>Nein, das kann man nicht nach dem Einlesen abfangen, da im Falle eines Overflows alle Zeichen im Stream bleiben sollen. .putback() ist aber nur für 1 Zeichen nach der letzten Leseoperation definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203510</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 19 Apr 2012 07:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 07:50:39 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Im Normalfall muss man Input sowieso selbst verifizieren, dazu sind die Stream wirklich nicht gedacht.</p>
</blockquote>
<p>das ist so nicht richtig. Streams dienen dazu, aus einer Folge von Zeichen (hier Ziffern) eine Variable eines bestimmten Typs zu belegen (hier uint8_t). Das ist entweder möglich oder eben nicht; und im letzteren Fall sollte der Stream in den Zustand fail gehen.</p>
<p>Der Normalfall ist, dass für den gewünschten Typ ein entsprechender <a href="http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/" rel="nofollow">Streaming-Operator</a> existiert. Egal ob aus dem Standard oder selbst geschrieben. Das Problem ist hier, dass ein uin8_t eben kein Integer im Sinne einer Zahl ist, sondern ein Zeichen. D.h. es existiert bereits ein Streaming-Operator, der aber was anderes tut.<br />
In solchen Fällen kann man sich immer mit einem <a href="http://www.cplusplus.com/reference/iostream/manipulators/" rel="nofollow">Manipulator</a> behelfen.</p>
<p>Ich skizzier' mal was:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;cstdint&gt; // std::uint8_t
#include &lt;limits&gt;

struct read_uint8 // Manipulator zum Einlesen von std::uint8_t
{
    typedef std::uint8_t value_type;
    explicit read_uint8( value_type&amp; target )
        : target_( target )
    {}
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, read_uint8 rdr )
    {
        unsigned i;
        if( in &gt;&gt; i &amp;&amp; i &gt; unsigned(std::numeric_limits&lt; value_type &gt;::max()) )
            in.setstate( std::ios_base::failbit ); // boost::numeric_cast wäre hier auch angebracht
        if( in )
            rdr.target_ = value_type( i );
        return in;
    }
private:
    value_type&amp; target_;
};

int main()
{
    using namespace std;
    istringstream in(&quot;1 34 255 256 1 egal&quot;);
    for( uint8_t i; in &gt;&gt; read_uint8( i ); )
        cout &lt;&lt; &quot;Gelesen: &quot; &lt;&lt; int(i) &lt;&lt; endl;
    in.clear();
    cout &lt;&lt; &quot;Rest: [&quot; &lt;&lt; in.rdbuf() &lt;&lt; &quot;]&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203515</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 19 Apr 2012 07:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 08:05:13 GMT]]></title><description><![CDATA[<p>Also jetzt verstehe ich gar nichts mehr. Ich hätte gedacht, wenn ein Wert zu groß ist, wird der Stream dadurch nicht verändert, offenbar ist das aber doch nicht so. <a href="http://ideone.com/VmHXE" rel="nofollow">http://ideone.com/VmHXE</a><br />
Wieso wird hier die zu große Zahl aus dem Streambuffer gelöscht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203523</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 19 Apr 2012 08:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 08:14:57 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Also jetzt verstehe ich gar nichts mehr. Ich hätte gedacht, wenn ein Wert zu groß ist, wird der Stream dadurch nicht verändert, offenbar ist das aber doch nicht so. <a href="http://ideone.com/VmHXE" rel="nofollow">http://ideone.com/VmHXE</a><br />
Wieso wird hier die zu große Zahl aus dem Streambuffer gelöscht?</p>
</blockquote>
<p>wenn eine Lesefehler auftritt - und ein 'zu groß' ist auch eine Lesefehler - so wird zumindest das fail-Bit gesetzt, und damit der Stream verändert.</p>
<p>Die zu große Zahl (hier 256) wird nicht gelöscht. Sie wird interpretiert, als zu groß erkannt und dann verworfen. Natürlich muss sie dazu vorher aus dem Streambuf gelesen werden. Wie Du schon richtig erkannt hast, kann ein streambuf im Normalfall nur ein Zeichen weit 'sehen'.<br />
Wenn also die Zeichen '2', '5' und '6' im Streambuffer stehen, so ist die Welt nach '2' und '5' noch in Ordnung. Und ein Overflow kann frühestens dann erkannt werden, wenn das nächste Zeichen gelesen wurde; vorher eben nicht. Bei meiner Implementierung wird der Overflow sogar erst dann erkannt, wenn ein kompletter 'unsigned int' eingelesen wurde. Das könnte man noch verbessern, aber die '2' und die '5' müssen gelesen (und konsumiert!) werden, d.h. sie sind im Allgemeinen für weitere Leseoperationen verloren.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203526</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 19 Apr 2012 08:14:57 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 08:25:04 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung, das ergibt natürlich Sinn. Ich denke, ich habe es nun verstanden, denn einen solchen Manipulator hätte ich auch noch hinbekommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Macht es eigentlich einen Unterschied, ob man std::ios::failbit oder std::ios_base::failbit schreibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203527</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 19 Apr 2012 08:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to uint8_t korrekt von istream lesen on Thu, 19 Apr 2012 08:31:11 GMT]]></title><description><![CDATA[<p>Das habe ich doch als Argument dazugesagt, weshalb ich einfach danach prüfen würde, siehe mein Codesnippet. <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>
<p>Ob das Ganze mit dem Manipulator schöner wird? Bezweifle es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203532</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 19 Apr 2012 08:31:11 GMT</pubDate></item></channel></rss>