<?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[istream-operatoren ausnahmesicher machen]]></title><description><![CDATA[<p>hallo</p>
<p>ich habe eine klasse. für diese klasse biete ich einen &quot; <code>operator&lt;&lt;</code> &quot; und einen &quot; <code>operator&gt;&gt;</code> &quot; an. ich möchte diese beiden funktionen gerne ausnahmesicher gestalten. beim ausgabe-operator ist es mir klar, wie ich das machen soll. beim lese-operator nicht so ganz. meine idee:<br />
die position mit einer variable und mit <code>std::basic_istream&lt;&gt;::tellg()</code> speichern und im falle einer ausnahme mit <code>std::basic_istream&lt;&gt;::seekg()</code> wiederherstellen. ich bin mir nicht so sicher ob dies:<br />
1. korrekt ist<br />
2. auch in der praxis so gelöst wird</p>
<p>mich würde also eure meinung und eure eigenen ansätze dazu interessieren.</p>
<p>gruss.</p>
<p>ps.: was mir im bezug dazu auch aufgefallen ist, ist dass die input-operatoren für die nativen typen alle nur die grundlegende garantie (übersetzt man das so?) gewährleisten, so wie <code>seekg()</code> auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322786/istream-operatoren-ausnahmesicher-machen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 16:35:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322786.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jan 2014 20:29:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to istream-operatoren ausnahmesicher machen on Mon, 06 Jan 2014 20:29:29 GMT]]></title><description><![CDATA[<p>hallo</p>
<p>ich habe eine klasse. für diese klasse biete ich einen &quot; <code>operator&lt;&lt;</code> &quot; und einen &quot; <code>operator&gt;&gt;</code> &quot; an. ich möchte diese beiden funktionen gerne ausnahmesicher gestalten. beim ausgabe-operator ist es mir klar, wie ich das machen soll. beim lese-operator nicht so ganz. meine idee:<br />
die position mit einer variable und mit <code>std::basic_istream&lt;&gt;::tellg()</code> speichern und im falle einer ausnahme mit <code>std::basic_istream&lt;&gt;::seekg()</code> wiederherstellen. ich bin mir nicht so sicher ob dies:<br />
1. korrekt ist<br />
2. auch in der praxis so gelöst wird</p>
<p>mich würde also eure meinung und eure eigenen ansätze dazu interessieren.</p>
<p>gruss.</p>
<p>ps.: was mir im bezug dazu auch aufgefallen ist, ist dass die input-operatoren für die nativen typen alle nur die grundlegende garantie (übersetzt man das so?) gewährleisten, so wie <code>seekg()</code> auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375664</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 20:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to istream-operatoren ausnahmesicher machen on Mon, 06 Jan 2014 20:58:08 GMT]]></title><description><![CDATA[<blockquote>
<p>die position mit einer variable und mit std::basic_istream&lt;&gt;::tellg() speichern</p>
</blockquote>
<p>.. bitte sag mir nicht, dass deine I/O-Operatoren Funktionstemplates sind.</p>
<p>Wieso Operatoren eigentlich ausnahme-sicher machen?</p>
<blockquote>
<p>korrekt ist</p>
</blockquote>
<p>Nicht immer.</p>
<blockquote>
<p>auch in der praxis so gelöst wird</p>
</blockquote>
<p>Ein klares Nein (zumindest nie i.A.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375668</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 06 Jan 2014 20:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to istream-operatoren ausnahmesicher machen on Mon, 06 Jan 2014 21:16:45 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>die position mit einer variable und mit std::basic_istream&lt;&gt;::tellg() speichern</p>
</blockquote>
<p>.. bitte sag mir nicht, dass deine I/O-Operatoren Funktionstemplates sind.</p>
</blockquote>
<p>doch, das sage ich noch immer und du wirst mich noch immer darauf hinweisen, dass das overengineering ist.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Wieso Operatoren eigentlich ausnahme-sicher machen?</p>
</blockquote>
<p>gehen wir von einem fall aus, in welchem in einer datei viele dieser klassen gespeichert sind. nach 100'000 dieser klassen wirft einer dieser &quot; <code>operator&gt;&gt;</code> &quot;-en eine exception. mit der grundlegenden garantie ist ansich nicht versichert, dass ich danach an der selben stelle weiterlesen kann (so wie ich die grundlegende garantie verstanden habe ist nicht einmal garantiert das die selbe datei noch geöffnet ist).</p>
<p><a href="http://www.cplusplus.com/reference/istream/basic_istream/operator%3E%3E/" rel="nofollow">link</a>.</p>
<p><a href="http://www.cplusplus.com/reference/istream/basic_istream/operator%3E%3E/" rel="nofollow">http://www.cplusplus.com/reference/istream/basic_istream/operator&gt;&gt;/</a> schrieb:</p>
<blockquote>
<p>Basic guarantee: if an exception is thrown, the object is in a valid state.<br />
It throws an exception of member type failure if the resulting error state flag is not goodbit and member exceptions was set to throw for that state.<br />
Any exception thrown by an internal operation is caught and handled by the function, setting badbit. If badbit was set on the last call to exceptions, the function rethrows the caught exception.</p>
</blockquote>
<p>ich interpretiere das so, dass ich von nichts ausgehen darf was nicht explizit beschrieben ist. ich darf also davon ausgehen, dass der stream in einem gültigen zustand ist. mehr nicht. auch nicht, dass er - wie zuvor - mit einer datei verknüpft ist und an einer bestimmten stelle liest.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>korrekt ist</p>
</blockquote>
<p>Nicht immer.</p>
</blockquote>
<p>was genau nicht (aus neugier, nicht dass ich dir nicht glauben würde)?</p>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>auch in der praxis so gelöst wird</p>
</blockquote>
<p>Ein klares Nein (zumindest nie i.A.).</p>
</blockquote>
<p>willst du mit dem post andeuten, dass ich auf die exceptionsicherheit bei i-/o-operatoren verzichten soll und es keine ernstzunehmenden alternativen gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375671</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to istream-operatoren ausnahmesicher machen on Mon, 06 Jan 2014 22:12:08 GMT]]></title><description><![CDATA[<p>Stream Extraction Operatoren werden üblicherweise nicht exception-safe gemacht, da es nicht möglich ist sie für alle Streams bzw. unter allen Umständen exceptions-safe zu machen.</p>
<p><code>seekg</code> wird z.B. nicht funktionieren wenn der Stream mit der Konsole verbunden ist. Oder einem Socket, einer Pipe etc.</p>
<p>Und auf <code>putback</code> kann man sich auch nicht verlassen, da nicht garantiert ob bzw. wie oft <code>putback</code> funktionieren muss.</p>
<p>Wenn du nach einem Fehler weiterlesen können möchtest, dann wäre es vermutlich das Beste dich ausserhalb der Stream-Operatoren darum zu kümmern. Dort kannst du dann auch ganz einfach zwischen &quot;Stream Extraction Fehler&quot; und &quot;seekg Fehler&quot; unterscheiden.</p>
<p>Wobei mir der Sinn dahinter nicht ganz klar ist. Also: wozu willst du das haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375680</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 06 Jan 2014 22:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to istream-operatoren ausnahmesicher machen on Mon, 06 Jan 2014 22:55:10 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Stream Extraction Operatoren werden üblicherweise nicht exception-safe gemacht, da es nicht möglich ist sie für alle Streams bzw. unter allen Umständen exceptions-safe zu machen.</p>
<p><code>seekg</code> wird z.B. nicht funktionieren wenn der Stream mit der Konsole verbunden ist. Oder einem Socket, einer Pipe etc.</p>
<p>Und auf <code>putback</code> kann man sich auch nicht verlassen, da nicht garantiert ob bzw. wie oft <code>putback</code> funktionieren muss.</p>
</blockquote>
<p>achso, ja. leuchtet ein.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn du nach einem Fehler weiterlesen können möchtest, dann wäre es vermutlich das Beste dich ausserhalb der Stream-Operatoren darum zu kümmern. Dort kannst du dann auch ganz einfach zwischen &quot;Stream Extraction Fehler&quot; und &quot;seekg Fehler&quot; unterscheiden.</p>
<p>Wobei mir der Sinn dahinter nicht ganz klar ist. Also: wozu willst du das haben?</p>
</blockquote>
<p>mein bisheriger ansatz war es, den echten input-stream in &quot; <code>std::basic_istringstream</code> &quot;s aufzuteilen und von denen dann zu lesen. ich dachte, das ist eine unnötig umständliche version und wollte die aufgabe in den operator verschieben.</p>
<p>gut, dann ist das geklärt. danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375684</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 22:55:10 GMT</pubDate></item></channel></rss>