<?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[fstream.get() verschiebt die Leseposition nicht korrekt?]]></title><description><![CDATA[<p>Hallo Leute,<br />
bitte helft mir nochmal bei folgendem Phänomen:</p>
<p>Ich lese byteweise eine Datei aus einen fstream (mit .get()). Nach jedem .get() wird erwartungsgemäß die Lese-Position einen nach vorne geschoben, .get() liefert einen int. Nur wenn ich zwei Abfragen logisch verknüpfen (hier zB OR, also ||),</p>
<pre><code>fstream FS(&quot;C:\\zalternation.prg&quot;);

Console::WriteLine( ((FS.get()!=1) || (FS.get()!=2)) );
Console::WriteLine(&quot;tellg=&quot;+Convert::ToString(FS.tellg()));
</code></pre>
<p>Die Ausgabe lauet:<br />
True (Erwartungsgemäß, weil die ersten zwei eingelesenen Bytes weder 1 noch 2 sind)<br />
tellg=1</p>
<p>tellg=1? Die Position sollte nach zwei .get() bei tellg=2 stehen. Das Problem scheint in der logischen Verknüpfung zu liegen (bei UND, also &amp;&amp; klappt's erstaunlicherweise), denn</p>
<pre><code>fstream FS(&quot;C:\\zalternation.prg&quot;);

Console::WriteLine( (FS.get()!=1) );
Console::WriteLine( (FS.get()!=2) );
Console::WriteLine(&quot;tellg=&quot;+Convert::ToString(FS.tellg()));
</code></pre>
<p>liefert dann:<br />
True<br />
True<br />
tellg=2</p>
<p>Warum? Interpretiert der hier das logische Oder als irgendeinen Operator (ich kenne in dem Zusammenhang nur die Zuweiser &gt;&gt; und &lt;&lt;)?</p>
<p>Danke für Eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227769/fstream-get-verschiebt-die-leseposition-nicht-korrekt</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 19:22:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227769.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Nov 2008 18:50:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Wed, 19 Nov 2008 18:50:29 GMT]]></title><description><![CDATA[<p>Hallo Leute,<br />
bitte helft mir nochmal bei folgendem Phänomen:</p>
<p>Ich lese byteweise eine Datei aus einen fstream (mit .get()). Nach jedem .get() wird erwartungsgemäß die Lese-Position einen nach vorne geschoben, .get() liefert einen int. Nur wenn ich zwei Abfragen logisch verknüpfen (hier zB OR, also ||),</p>
<pre><code>fstream FS(&quot;C:\\zalternation.prg&quot;);

Console::WriteLine( ((FS.get()!=1) || (FS.get()!=2)) );
Console::WriteLine(&quot;tellg=&quot;+Convert::ToString(FS.tellg()));
</code></pre>
<p>Die Ausgabe lauet:<br />
True (Erwartungsgemäß, weil die ersten zwei eingelesenen Bytes weder 1 noch 2 sind)<br />
tellg=1</p>
<p>tellg=1? Die Position sollte nach zwei .get() bei tellg=2 stehen. Das Problem scheint in der logischen Verknüpfung zu liegen (bei UND, also &amp;&amp; klappt's erstaunlicherweise), denn</p>
<pre><code>fstream FS(&quot;C:\\zalternation.prg&quot;);

Console::WriteLine( (FS.get()!=1) );
Console::WriteLine( (FS.get()!=2) );
Console::WriteLine(&quot;tellg=&quot;+Convert::ToString(FS.tellg()));
</code></pre>
<p>liefert dann:<br />
True<br />
True<br />
tellg=2</p>
<p>Warum? Interpretiert der hier das logische Oder als irgendeinen Operator (ich kenne in dem Zusammenhang nur die Zuweiser &gt;&gt; und &lt;&lt;)?</p>
<p>Danke für Eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617319</guid><dc:creator><![CDATA[isitthatsimple]]></dc:creator><pubDate>Wed, 19 Nov 2008 18:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 09:10:31 GMT]]></title><description><![CDATA[<p>Kann es sein, dass hier nicht richtig von ios::operator! getrennt wird?</p>
<pre><code>int main () {
  ifstream is;
  is.open (&quot;test.txt&quot;);
  if (!is)
    cerr &lt;&lt; &quot;Error opening 'test.txt'\n&quot;;
  return 0;
}
</code></pre>
<p>Allerdings rufe ich ja eigentlich vorher die Methode get() auf:</p>
<pre><code>int main () {
  ifstream is;
  is.open (&quot;test.txt&quot;);
  if (!( (is.get()==0)&amp;&amp;(is.get()==0) )
    cerr &lt;&lt; &quot;Error opening 'test.txt'\n&quot;;
  return 0;
}
</code></pre>
<p>Ich verstehe das nicht.</p>
<p>Der if-Ausdruck wird doch von innen nach aussen abgearbeitet, d.h. erst werden die beiden get() ausgeführt, diese dann mit 0 verglichen und zum Schluss gibt's einen bool aus der Und-Verknüpfung.</p>
<p>Kein Experte an Bord?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617543</guid><dc:creator><![CDATA[isitthatsimple]]></dc:creator><pubDate>Thu, 20 Nov 2008 09:10:31 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 09:48:22 GMT]]></title><description><![CDATA[<p>Die Operatoren &amp;&amp; und || sind Kurzschluss-Operatoren. Das heisst, dass die zweite Bedingung nicht ausgewertet wird, wenn nach der Auswertung der ersten Bedingung schon das Ergebnis feststeht.</p>
<p>EDIT:</p>
<p>isitthatsimple schrieb:</p>
<blockquote>
<p>[...] erst werden die beiden get() ausgeführt, diese dann mit 0 verglichen und zum Schluss gibt's einen bool aus der Und-Verknüpfung.</p>
</blockquote>
<p>Hier liegt der Denkfehler. Erst wird die erste Bedingung vollständig ausgewertet, dann das Gesamtergebnis betrachtet, und erst wenn die zweite Bedingung das Ergebnis noch zu beeinflussen in der Lage ist, wird diese auch ausgewertet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617579</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 20 Nov 2008 09:48:22 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 09:52:40 GMT]]></title><description><![CDATA[<p>Ja, stimmt, hast Recht. Kann ich das irgendwie beeinflussen? Das Problem ist, dass ich die Position im stream als Flusskontrolle brauche. Kann ich die Ausführung beider expressions erzwingen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617586</guid><dc:creator><![CDATA[isitthatsimple]]></dc:creator><pubDate>Thu, 20 Nov 2008 09:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 10:01:09 GMT]]></title><description><![CDATA[<p>&amp; statt &amp;&amp;, laut MSDN. Mal sehen, ob das geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617603</guid><dc:creator><![CDATA[isitthatsimple]]></dc:creator><pubDate>Thu, 20 Nov 2008 10:01:09 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 12:20:27 GMT]]></title><description><![CDATA[<p>Nee, reicht so nicht. Abhilfe schafft hier wohl nur folgendes:</p>
<pre><code>if (!(Convert::ToBoolean((is.get()==0)) &amp; Convert::ToBoolean((is.get()==0)) )
</code></pre>
<p>Leider funktioniert auch das nur, wenn man zusätzlich einen Zähler manuell mitlaufen lässt (also die Anzahl der get()-Aufrufe mitzählen) und NACH JEDEM (logischem) Vegleich per seekg den Zähler nachzieht. Ich verstehe das nicht wirklich.</p>
<p>Falls einer was Schlaues weiss .. ich wäre wirklich dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617680</guid><dc:creator><![CDATA[isitthatsimple]]></dc:creator><pubDate>Thu, 20 Nov 2008 12:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to fstream.get() verschiebt die Leseposition nicht korrekt? on Thu, 20 Nov 2008 20:19:00 GMT]]></title><description><![CDATA[<p>Was ist eigentlich <code>Convert::ToBoolean</code> ? Reicht ein <code>static_cast&lt;bool&gt;</code> nicht? Oder sonst halt in einen boolschen Ausdruck setzen, in dem man auf Ungleichheit mit 0 überprüft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617967</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 20 Nov 2008 20:19:00 GMT</pubDate></item></channel></rss>