<?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[[gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife]]></title><description><![CDATA[<p>Hallo ich bins mal wieder mit einer vermutlich für euch leicht lösbaren aufgabe.<br />
Das ist ein Teil meines Programms mit der ich Zahlen aus einer .txt Datei einlesen möchte.<br />
Mein Problem ist aber dass die letzte Zahl doppelt eingelesen wird.<br />
Also in der Datei steht:<br />
4<br />
3<br />
2</p>
<p>Die Ausgabe ist:<br />
die eingelesene Zahl ist: 4<br />
die eingelesene Zahl ist: 3<br />
die eingelesene Zahl ist: 2<br />
die eingelesene Zahl ist: 2<br />
der mittelwert ist 2 (weil als int deklariert keine Kommazahl)</p>
<pre><code class="language-cpp">while (!ausgeben.eof())
    {
        divisor++;
        ausgeben &gt;&gt; eingelesenezahl;
        cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
        summe += eingelesenezahl;
    }

    mittelwert= (summe/divisor);
    cout &lt;&lt; &quot; der mittelwert ist &quot; &lt;&lt; mittelwert &lt;&lt; endl;
</code></pre>
<p>Ich hab schon viele Sachen im www gefunden daraus werde ich aber nicht schlau.<br />
Danke im Vorraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303465/gelöst-problem-mit-quot-aus-datei-lesen-quot-while-schleife</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 11:11:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303465.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2012 18:47:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 20:59:45 GMT]]></title><description><![CDATA[<p>Hallo ich bins mal wieder mit einer vermutlich für euch leicht lösbaren aufgabe.<br />
Das ist ein Teil meines Programms mit der ich Zahlen aus einer .txt Datei einlesen möchte.<br />
Mein Problem ist aber dass die letzte Zahl doppelt eingelesen wird.<br />
Also in der Datei steht:<br />
4<br />
3<br />
2</p>
<p>Die Ausgabe ist:<br />
die eingelesene Zahl ist: 4<br />
die eingelesene Zahl ist: 3<br />
die eingelesene Zahl ist: 2<br />
die eingelesene Zahl ist: 2<br />
der mittelwert ist 2 (weil als int deklariert keine Kommazahl)</p>
<pre><code class="language-cpp">while (!ausgeben.eof())
    {
        divisor++;
        ausgeben &gt;&gt; eingelesenezahl;
        cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
        summe += eingelesenezahl;
    }

    mittelwert= (summe/divisor);
    cout &lt;&lt; &quot; der mittelwert ist &quot; &lt;&lt; mittelwert &lt;&lt; endl;
</code></pre>
<p>Ich hab schon viele Sachen im www gefunden daraus werde ich aber nicht schlau.<br />
Danke im Vorraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211471</guid><dc:creator><![CDATA[Jinx]]></dc:creator><pubDate>Mon, 14 May 2012 20:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 19:01:32 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass das eof-Bit erst in dem Moment gesetzt wird, wo eine Leseoperation aufgrund des Dateiendes fehlschlägt, d.h. versucht wurde, über das Ende zu lesen...</p>
<p>Lösung:</p>
<pre><code class="language-cpp">while (ausgeben &gt;&gt; eingelesenezahl)
{
  ++divisor;
  cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt; eingelesenezahl &lt;&lt; endl;
  summe += eingelesenezahl;
}

mittelwert = summe / divisor;
cout &lt;&lt; &quot; der mittelwert ist &quot; &lt;&lt; mittelwert &lt;&lt; endl;
</code></pre>
<p>Bzw. eben einfach erst nach dem Einlesen auf eof() checken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211479</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 14 May 2012 19:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 19:07:27 GMT]]></title><description><![CDATA[<p>Typischer Logikdreher. Woher hast du das? Ich würde gerne mal wissen, woher diese Anfängerpest kommt?</p>
<p>Du prüfst, liest, verarbeitest. Richtig wäre lesen, prüfen, verarbeiten. Also:</p>
<pre><code class="language-cpp">for (;;)  // Endlosschleife
{
 ausgeben &gt;&gt; eingelesenezahl; // lesen
 if (ausgeben.eof())          // prüfen
  break;
 // verarbeiten:
 divisor++;
 cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
 summe += eingelesenezahl;
}
</code></pre>
<p>Das ist aber noch nicht gut. Wir prüfen beispielsweise nur auf eof, wir können auch gleich auf alle Fehler prüfen:</p>
<pre><code class="language-cpp">if (!ausgeben.good())          // prüfen
  break;
</code></pre>
<p>Das kann man auch <a href="http://www.cplusplus.com/reference/iostream/ios/operatornot/" rel="nofollow">kurz schreiben</a>:</p>
<pre><code class="language-cpp">if (!ausgeben)
  break;
</code></pre>
<p>Der <a href="http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/" rel="nofollow">Leseoperator</a> gibt den Stream selber zurück, daher können wir auch Lesen und Prüfung zusammenpacken:</p>
<pre><code class="language-cpp">while((ausgeben &gt;&gt; eingelesenezahl).good())  // lese, dann prüfe
 {
  // verarbeiten ...
 }
</code></pre>
<p>Oder mit der <a href="http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/" rel="nofollow">Verkürzung</a> wie oben:</p>
<pre><code class="language-cpp">while(ausgeben &gt;&gt; eingelesenezahl))  // lese, dann prüfe
 {
  // verarbeiten ...
 }
</code></pre>
<p>Variablen wollen wir immer so lokal wie möglich halten. Hier müsste die <code>eingelesenezahl</code> in einem Scope um der Schleife leben. Mit einer for-Schleife können wir sie lokaler machen und erhalten das Endresultat:</p>
<pre><code class="language-cpp">for(int eingelesenezahl; ausgeben &gt;&gt; eingelesenezahl; ++divisor)
{
  cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
  summe += eingelesenezahl;
}
</code></pre>
<p>Bitte beantworte noch, wo du deine Version her hattest, ich möchte das wirklich mal wissen, damit ich in Zukunft davor warnen kann. Dieses Problem ist in letzter Zeit die Seuche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211483</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 May 2012 19:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 19:36:40 GMT]]></title><description><![CDATA[<p>Danke für eure Mühen und besonders die Erklärungaber<br />
wenn ich das so mache:</p>
<pre><code class="language-cpp">while(ausgeben &gt;&gt; eingelesenezahl))  // lese, dann prüfe
 {
  // verarbeiten ...
 }
</code></pre>
<p>werden von den 3 Zahlen in der Datei aber nur noch die 2. und die 3. auf den Bildschirm ausgegeben.</p>
<p>Zum einen hab ich das von einem script in der Schule und aus einem Buch von GalileoComputing (wobei ich das bisschen abgeändert hab weil das Orginal aus dem Buch viele Sachen drin hatte die wir in der Schule noch nicht hatten und ich das Buch begleitend benutzen will weil ich den Lehrer nicht so richtig verstehe)</p>
<p>Die ausfühliche Art:</p>
<pre><code class="language-cpp">for (;;)  // Endlosschleife
{
 ausgeben &gt;&gt; eingelesenezahl; // lesen
 if (ausgeben.eof())          // prüfen
  break;
 // verarbeiten:
 divisor++;
 cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
 summe += eingelesenezahl;
}
</code></pre>
<p>führt aber zum gewünschten Ergebnis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211496</guid><dc:creator><![CDATA[Jinx]]></dc:creator><pubDate>Mon, 14 May 2012 19:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 19:41:49 GMT]]></title><description><![CDATA[<p>Dann zeig mal bitte den kompletten Code wie er jetzt ist. Die Antworten sind an sich richtig, vermutlich hast du irgendeine Kleinigkeit falsch verstanden. Hast du eventuell</p>
<pre><code class="language-cpp">while(ausgeben &gt;&gt; eingelesenezahl))  // lese, dann prüfe
 {
  ausgeben &gt;&gt; eingelesenezahl; // lesen
  divisor++;
  cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
  summe += eingelesenezahl;  // verarbeiten ...
 }
</code></pre>
<p>geschrieben und somit doppelt gelesen? Dies würde nämlich nur die zweite und dritte Zahl anzeigen.</p>
<p>Dein Lehrer ist übrigens höchstwahrscheinlich jemand, der mal C gelernt hat, aber den Unterschied zwischen C und C++ nie kapiert hat (du Armer, das sind die schlimmsten). Das Buch, ich rate mal, ist von Jürgen Wolf, oder? Siehe auch:<br />
<a href="http://www.c-plusplus.net/forum/272350" rel="nofollow">http://www.c-plusplus.net/forum/272350</a><br />
Das gilt bedingt auch für die meisten anderen Bücher aus dem Hause Galileo Computing. Benutz es der Jahreszeit gemäß als Grillanzünder, dann hast du wenigstens noch etwas davon. Jedenfalls ist das Buch ohne Scherz so schlecht, dass du selber schlechter in C++ wirst, wenn du es liest. Und das schlimmste ist, du merkst es zuerst gar nicht, da es oberflächlich funktioniert, sondern erst bei solchen merkwürdigen Fehlern wie diesem hier, wenn du dir die falschen Sachen schon angewöhnt hast.</p>
<p>Siehe auch den zweiten Link in meiner Signatur für gute Bücher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211499</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 May 2012 19:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 19:53:15 GMT]]></title><description><![CDATA[<p>Die Ausfühliche funktionierende Variante:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

int main()
{
    int mittelwert,eingelesenezahl, anfangswert, anzahlzahlen, eingegebenezahl, zahl, divisor = 0;
    int summe = 0;
    anfangswert = 0;
    zahl = 0;
    ofstream werte (&quot;werte.txt&quot;);
    cout &lt;&lt; &quot;Wieviele zahlen moechten sie eingeben?&quot;;
    cin &gt;&gt; anzahlzahlen;
    while (anfangswert &lt; anzahlzahlen)
    {
        cout &lt;&lt; &quot;Geben sie Ihre zahlen an: &quot;;
        cin &gt;&gt; eingegebenezahl;
        anfangswert++;
        werte &lt;&lt; eingegebenezahl &lt;&lt; endl;
    }
    werte.close();
    ifstream ausgeben(&quot;werte.txt&quot;);
    for (;;)  // Endlosschleife
        {
        ausgeben &gt;&gt; eingelesenezahl; // lesen
        if (ausgeben.eof())          // prüfen
        break;
        // verarbeiten:
        divisor++;
        cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
        summe += eingelesenezahl;
}

    mittelwert= (summe/divisor);
    cout &lt;&lt; &quot; der mittelwert ist &quot; &lt;&lt; mittelwert &lt;&lt; endl;

    werte.close();
    return 0;
}
</code></pre>
<p>die kurze Version:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

int main()
{
    int mittelwert,eingelesenezahl, anfangswert, anzahlzahlen, eingegebenezahl, zahl, divisor = 0;
    int summe = 0;
    anfangswert = 0;
    zahl = 0;
    ofstream werte (&quot;werte.txt&quot;);
    cout &lt;&lt; &quot;Wieviele zahlen moechten sie eingeben?&quot;;
    cin &gt;&gt; anzahlzahlen;
    while (anfangswert &lt; anzahlzahlen)
    {
        cout &lt;&lt; &quot;Geben sie Ihre zahlen an: &quot;;
        cin &gt;&gt; eingegebenezahl;
        anfangswert++;
        werte &lt;&lt; eingegebenezahl &lt;&lt; endl;
    }
    werte.close();
    ifstream ausgeben(&quot;werte.txt&quot;);
    while (ausgeben &gt;&gt; eingelesenezahl)
    {
        divisor++;
        ausgeben &gt;&gt; eingelesenezahl;
        cout &lt;&lt; &quot;die eingelesene Zahl ist &quot; &lt;&lt;eingelesenezahl &lt;&lt; endl;
        summe += eingelesenezahl;
    }

    mittelwert= (summe/divisor);
    cout &lt;&lt; &quot; der mittelwert ist &quot; &lt;&lt; mittelwert &lt;&lt; endl;

    werte.close();
    return 0;
}
</code></pre>
<p>Ja kann sein dass der Lehrer mal erwähnt hat dass es C gelernt hat.<br />
Das Buch ist von Arnold Willemer- Einstieg in C++</p>
<p>Ich hab mir deinen link mal angeschaut, aber ich überlege ob es sich noch lohnt ein neues Buch zu kaufen da wir nächstes Jahr höchstwahrscheinlich Java haben.<br />
Hast du da evtl auch Vorschläger oder ist ein gutes C++Buch ein guter Grundstein für Java?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211501</guid><dc:creator><![CDATA[Jinx]]></dc:creator><pubDate>Mon, 14 May 2012 19:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 20:31:00 GMT]]></title><description><![CDATA[<p>Du machst bei der gekürzten Version das, was ich oben schon vorausgesagt habe: Du liest in Zeile 26 ein zweites Mal pro Schleifendurchlauf ein. Dadurch liest du erfolgreich die erste Zahl, gehst somit in den Schleifenkörper, dort liest du die zweite Zahl, gibst diese aus, liest im Schleifenkopf erfolgreich die dritte Zahl, gehst somit in den Schleifenkörper, liest noch eine Zahl, dies scheitert und es wird (dieses Verhalten ist nicht garantiert, aber machen viele Implementierungen so) der alte Wert nicht verändert, also wird die dritte Zahl ausgegeben. Im Schleifenkopf wird dann erfolglos versucht eine weitere Zahl zu lesen, die Schleife bricht ab.</p>
<p>Lass die Zeile 26 einfach weg.</p>
<p>Bei dem Buchlink ist auch ein kostenloses Ebook verlinkt (Thinking in C++), das ist sicherlich nicht verkehrt. Geht jedoch sehr theoretisch mit allgemeiner Programmgestaltung los, also vermutlich ganz anders als in der Schule, wo so etwas vermutlich nur am Rande kommt, wenn überhaupt, obwohl dies ein sehr wichtiges Thema ist. C++ und Java sehen sich zwar ähnlich, sind aber im Kern sehr unterschiedliche Programmierphilosophien. Außer Grundkonstrukten wie Schleifen und Abfragen und der Bedeutung der ganzen Sonderzeichen wirst du nicht viel mitnehmen können. Allgemeine Programmgestaltung (wie in dem oben genannten Buch) wird sicherlich auch zu einem gewissen Grad nützlich sein, da Thinking in C++ sehr stark den objektorientierten Aspekt von C++ betont, zu dem man in Java praktisch gezwungen wird.</p>
<p>P.S.: Lass doch das close bei den Dateien weg. Und definier Variablen erst dort, wo du sie brauchst. Noch zwei Artefakte aus der C-Programmierung, welche dein Lehrer und dein Buchautor nicht richtig können. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Die Dateistreams gehen von alleine zu, wenn sie ihren Gültigkeitsbereich verlassen. Du machst auch prompt etwas falsch bei dir und schließt den einen Stream doppelt, den anderen gar nicht (was, wie gesagt, nicht weiter schlimm ist, da er das dann auch selber tut). Das Buch landet auf jeden Fall auf der Giftliste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211529</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 May 2012 20:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Problem mit &amp;quot;aus Datei lesen&amp;quot; while-Schleife on Mon, 14 May 2012 20:59:16 GMT]]></title><description><![CDATA[<p>Ich muss ehrlich sagen &quot;verstanden&quot; hab ich die kurze Version noch nicht 100% deshalb werd ich vorerst mal die lange Version nutzen. Liber minimal langsamer und dafür sicher als bisschen schneller und dann evtl falsch.</p>
<p>Dass ich die Deklarationen immer oben habe kommt glaube ich von mir weil ich dachte dass es für spätere Änderungen evtl einfacher sein könnte wenn alle Deklarationen an einem Ort sind, aber ich werde versuchen deine Tips zu beherzigen :-).</p>
<p>Vielen Dank nochmal vorallem für die Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211574</guid><dc:creator><![CDATA[Jinx]]></dc:creator><pubDate>Mon, 14 May 2012 20:59:16 GMT</pubDate></item></channel></rss>