<?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[Frage zu IOStreams Designentscheidung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu den IOStreams, speziell zu den Arithmetic Extractors.</p>
<p>Das exakte Regelwerk ist zwar in &quot;Standard C++ IOStreams and Locales&quot; und dem Standard selbst genau beschrieben, allerdings komme ich an einer Stelle ans Grübeln warum die Entscheidung so gefällt wurde.</p>
<p>Es geht genau um das hier:</p>
<pre><code class="language-cpp">int i;
cin &gt;&gt; i;
</code></pre>
<p>funktioniert wunderbar (failbit nicht gesetzt), auch wenn man z.B. 123abc eingibt (in i steht dann 123). Ich würde die gewagte Behauptung aufstellen wollen, das ist nicht das was man natürlich erwarten würde. Warum wird das Extrahieren nicht gestoppt, wenn man auf ein Whitespace trifft; bzw. mit failbit abgebrochen wenn man auf ungültige Daten trifft? Ich könnte mir vorstellen, dass man ungültige Zeichen nicht einfach verbrauchen will und diese dann verloren gehen, da man immer nur maximal ein Zeichen wieder zurück in den Stream legen kann.<br />
Allerdings würde ich hier gerne mal eine genaue Begründung oder Diskussion über das Für und Wider lesen. Eine google-groups Suche nach den üblichen Verdächtigen (Dietmar Kühl <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="👍"
    />) liefert leider viel zu viel Mist, um das alles durchzuschauen.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197575/frage-zu-iostreams-designentscheidung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 09:29:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197575.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Nov 2007 14:27:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 14:34:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu den IOStreams, speziell zu den Arithmetic Extractors.</p>
<p>Das exakte Regelwerk ist zwar in &quot;Standard C++ IOStreams and Locales&quot; und dem Standard selbst genau beschrieben, allerdings komme ich an einer Stelle ans Grübeln warum die Entscheidung so gefällt wurde.</p>
<p>Es geht genau um das hier:</p>
<pre><code class="language-cpp">int i;
cin &gt;&gt; i;
</code></pre>
<p>funktioniert wunderbar (failbit nicht gesetzt), auch wenn man z.B. 123abc eingibt (in i steht dann 123). Ich würde die gewagte Behauptung aufstellen wollen, das ist nicht das was man natürlich erwarten würde. Warum wird das Extrahieren nicht gestoppt, wenn man auf ein Whitespace trifft; bzw. mit failbit abgebrochen wenn man auf ungültige Daten trifft? Ich könnte mir vorstellen, dass man ungültige Zeichen nicht einfach verbrauchen will und diese dann verloren gehen, da man immer nur maximal ein Zeichen wieder zurück in den Stream legen kann.<br />
Allerdings würde ich hier gerne mal eine genaue Begründung oder Diskussion über das Für und Wider lesen. Eine google-groups Suche nach den üblichen Verdächtigen (Dietmar Kühl <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="👍"
    />) liefert leider viel zu viel Mist, um das alles durchzuschauen.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401884</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Nov 2007 14:34:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 14:39:37 GMT]]></title><description><![CDATA[<p>Weil <a href="http://man.cx/scanf(3)" rel="nofollow">man: scanf(3)</a> es genauso macht, schätze ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401888</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 12 Nov 2007 14:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 14:48:53 GMT]]></title><description><![CDATA[<p>Hehe, richtig. <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="😉"
    /> Im Standard wird's ja auch so erwähnt &quot;as scanf does&quot;. Dann wäre die Frage natürlich, warum es scanf so macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401893</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Nov 2007 14:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 14:55:45 GMT]]></title><description><![CDATA[<p>scanf() hatte nur sehr minimale Fehlerbehandlung - es zählte die Anzahl der erfolgreich gelesenen Parameter (und gab nur eine Fehler-Rückgabe, wenn gar nichts erkannt werden konnte). Und außerdem kann cin/scanf() ja zumindest eine Zahl auslesen und weitergeben, also ist es nicht nötig, dort bereits einen Fehler zu melden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401900</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 14:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 15:37:41 GMT]]></title><description><![CDATA[<p>scanf liest genau so lange, bis es auf einen Fehler trifft und hört danach auf (und setzt afaik (ohne es nachgeschlagen zu haben) den Stream auch in den Error-Status). Und zwar genau nach oben erwähnter Semantik. Das es das tut ist ja keine Frage (das weiß ich alles), sondern das warum.</p>
<p>Die Frage ist ja genau - warum ist es dort nicht &quot;nötig&quot; einen Fehler zu melden?</p>
<p>Was ich mir wie gesagt vorstellen kann ist folgendes:</p>
<p>- Input ist 123abc<br />
- 123 wurde gelesen<br />
- a wird über peek gesehen und als ungültig abgetan<br />
- Da bis hierhin potenziell/wahrscheinlich schon mehr als ein Zeichen gelesen wurde, kann man es nicht einfach wieder zurück in den Stream legen, da das im Standard festgesetzte Limit nur ein Zeichen ist (nehmen wir mal an wir lesen unbuffered von einem Bandlaufwerk). Die bisher gelesene Information darf aber auch auf keinen Fall verloren gehen. D.h. man darf den Stream nicht auf Error setzen und muss die Information (123) speichern.</p>
<p>Aber das ist eben nur meine Vermutung. Gibt es keine archivierten Diskussionen der Standardlibrary-Designer, warum genau das so gemacht wurde? Ich kann mir viel zusammen reimen, aber ein offizielles Statement ist das was ich suche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401928</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Nov 2007 15:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 15:52:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Warum wird das Extrahieren nicht gestoppt, wenn man auf ein Whitespace trifft; bzw. mit failbit abgebrochen wenn man auf ungültige Daten trifft?</p>
</blockquote>
<p>Warum sollte man das denn generell wollen?<br />
Es muß sowieso immer ein Zeichen mehr eingelesen werden, um das Ende einer Zahl zu erkennen (ob nun Leerzeichen, Zeilenende, Buchstabe oder sonstiges Zeichen) und der interne Lesezeiger bleibt einfach an dieser Stelle.</p>
<p>Deiner Aussage nach müßten dann ja alle Zahlen immer mit Whitespaces abgeschlossen werden. Dann wäre aber gerade das Extrahieren von Zahlen z.B. aus einem Dateinamen &quot;Test4711.txt&quot; extrem aufwändig.</p>
<p>Was ich mir vorstellen könnte, wäre die Einführung eines Flags (Manipulators), welches entscheidet, ob failbit gesetzt wird (bzw. eine Exception geworfen wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401935</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 12 Nov 2007 15:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 16:01:53 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Warum sollte man das denn generell wollen?</p>
</blockquote>
<p>Naja, weil es zumindest der natürlichen/alltäglichen/menschlichen Wahrnehmung einer Zahl entspricht (behaupte ich). Generell wollen - okay, soweit will nicht gehen, da es ja auch anders, wie du schreibst, Sinn macht.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Deiner Aussage nach müßten dann ja alle Zahlen immer mit Whitespaces abgeschlossen werden. Dann wäre aber gerade das Extrahieren von Zahlen z.B. aus einem Dateinamen &quot;Test4711.txt&quot; extrem aufwändig.</p>
</blockquote>
<p>Hmm, gutes Argument.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Was ich mir vorstellen könnte, wäre die Einführung eines Flags (Manipulators), welches entscheidet, ob failbit gesetzt wird (bzw. eine Exception geworfen wird).</p>
</blockquote>
<p>Das wäre auch noch was. Wäre dann in sofern überflüssig wenn es so funktioniert wie jetzt man man die Prüfung selber macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401942</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Nov 2007 16:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Mon, 12 Nov 2007 21:50:18 GMT]]></title><description><![CDATA[<p>Ich halte es für praktikabler, wenn das Einlesen einer Zahl aus z.B.: &quot;123abc&quot; mit dem 'a' stoppt und keinen (!) Fehler setzt. Der Lesezeiger steht ja jetzt auf dem 'a' und wenn Du als User das nicht ok findest (Format nicht wie erwartet) dann kannst Du ja immer noch ein failbit setzen. Umgekehrt wird's schwierig.</p>
<p>Außerdem halte ich es z-B. für sinnvoll, Zahlen mit angehängten Einheitsbezeichnern einlesen zu können.</p>
<pre><code>12.3km
    -0.09m
    12°C
    34°F
</code></pre>
<p>Das geht nur dann ohne Kopfstände, wenn man die Zahl ohne Fehler lesen kann und anschließend die Zeichen dahinter auswertet, um ggf. die Zahl nochmal mit einem Faktor zu multiplizieren.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402146</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 12 Nov 2007 21:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu IOStreams Designentscheidung on Tue, 13 Nov 2007 08:38:06 GMT]]></title><description><![CDATA[<p>Ja, da ist was dran. Das sind wohl ausreichend Gründe dafür es genau so zu machen. Manchmal übersieht man solche einfachen Sachen beim Grübeln einfach <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/1402275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402275</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Nov 2007 08:38:06 GMT</pubDate></item></channel></rss>