<?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 while schleife]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich lese aktuell das Buch von &quot;Ulrich breymann&quot; &quot;Der C++ Programmierer&quot;<br />
(c++11 aktualisiert)</p>
<p>Ich bin jetzt bei &quot;Datei Ein und Ausgabe&quot; mit ifstrema / ofstream</p>
<p>Hier der Code vom Beispiel</p>
<pre><code>/* cppbuch/k2/dateianzeigen.cpp
   Beispiel zum Buch von Ulrich Breymann: Der C++ Programmierer; Hanser Verlag
   Diese Software ist freie Software. Website zum Buch: http://www.cppbuch.de/ 
*/
#include &lt;string&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
using namespace std;

int main() {
  string quelldateiname;
  cout &lt;&lt; &quot;Quelldatei? &quot;;
  cin &gt;&gt; quelldateiname;
  ifstream quelle(quelldateiname); // Objekt für Eingabestrom
  if (!quelle) {                   // Fehlerabfrage
    cerr &lt;&lt; quelldateiname &lt;&lt; &quot; kann nicht geöffnet werden!\n&quot;;
  } else {
    // Lesen der Datei und Anzeige der Zeilen

    while (quelle) {
      string zeile;
      getline(quelle, zeile);
      cout &lt;&lt; zeile &lt;&lt; endl;
    }

  }
} // Datei wird am Programmende automatisch geschlossen.
</code></pre>
<p>Ich verstehe nur nicht, wie die Whileschleife (Zeile 22)&quot;while(quelle){...}&quot; funktioniert.<br />
Warum steht da &quot;quelle&quot; im Bedingungsteil und nicht ein true oder false wert (bsw i &lt; 7);</p>
<p>Ich ahne, dass es etwas mit &quot;Container und Schleifen&quot; zu tun hat. aber mir fällt nichts ein.</p>
<p>Danke im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327309/frage-zu-while-schleife</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 10:45:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327309.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Aug 2014 15:58:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 15:58:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich lese aktuell das Buch von &quot;Ulrich breymann&quot; &quot;Der C++ Programmierer&quot;<br />
(c++11 aktualisiert)</p>
<p>Ich bin jetzt bei &quot;Datei Ein und Ausgabe&quot; mit ifstrema / ofstream</p>
<p>Hier der Code vom Beispiel</p>
<pre><code>/* cppbuch/k2/dateianzeigen.cpp
   Beispiel zum Buch von Ulrich Breymann: Der C++ Programmierer; Hanser Verlag
   Diese Software ist freie Software. Website zum Buch: http://www.cppbuch.de/ 
*/
#include &lt;string&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
using namespace std;

int main() {
  string quelldateiname;
  cout &lt;&lt; &quot;Quelldatei? &quot;;
  cin &gt;&gt; quelldateiname;
  ifstream quelle(quelldateiname); // Objekt für Eingabestrom
  if (!quelle) {                   // Fehlerabfrage
    cerr &lt;&lt; quelldateiname &lt;&lt; &quot; kann nicht geöffnet werden!\n&quot;;
  } else {
    // Lesen der Datei und Anzeige der Zeilen

    while (quelle) {
      string zeile;
      getline(quelle, zeile);
      cout &lt;&lt; zeile &lt;&lt; endl;
    }

  }
} // Datei wird am Programmende automatisch geschlossen.
</code></pre>
<p>Ich verstehe nur nicht, wie die Whileschleife (Zeile 22)&quot;while(quelle){...}&quot; funktioniert.<br />
Warum steht da &quot;quelle&quot; im Bedingungsteil und nicht ein true oder false wert (bsw i &lt; 7);</p>
<p>Ich ahne, dass es etwas mit &quot;Container und Schleifen&quot; zu tun hat. aber mir fällt nichts ein.</p>
<p>Danke im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411774</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Sun, 03 Aug 2014 15:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 16:16:19 GMT]]></title><description><![CDATA[<p>Durch Operatoren-Überladung, in diesem Fall <code>bool operator()</code> ), kann in C++ ein Objekt zu <code>true</code> und <code>false</code> ausgewertet werden. In <code>while(quelle)</code> wird implizit diese Operator-Methode aufgerufen.</p>
<p>Wenn du den Stream öffnest und dabei kein Fehler auftritt, dann ist dein Stream-Objekt in einem gültigen Zustand und liefert <code>true</code> . Wenn nun das Ende des Files erreicht wird oder ein Fehler auftritt, dann wird ein Fehler-Flag gesetzt und dein Objekt wird zu <code>false</code> ausgewertet.</p>
<p><code>while ( quelle )</code> bedeutet also, dass das Programm die Schleife ausführen soll, solange das Programm weiteren Input lesen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411780</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 03 Aug 2014 16:16:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 16:16:55 GMT]]></title><description><![CDATA[<p>Das hat nichts mit der while-Schleife an sich zu tun sondern mit dem ifstream. Der ifstream ist in bool konvertierbar und gibt dann zurueck, ob er im &quot;good&quot; Status ist, d.h. ob alle bisherigen Operationen erfolgreich waren.<br />
Die Schleife bedeutet daher &quot;Solange alles okay ist ...&quot;.</p>
<p>Allerdings hat der Code einen Logikfehler. Es wird zuerst geprueft, ob der Stream good ist, danach eingelesen und das ungeprueft eingelesene ausgegeben. Richtig waere ...</p>
<pre><code>string zeile;

while(getline(quelle, zeile))
    cout &lt;&lt; zeile &lt;&lt; '\n';
</code></pre>
<p>... also einlesen -&gt; pruefen -&gt; verarbeiten</p>
<p>Oder (meiner Meinung nach schoener):</p>
<pre><code>for(string zeile; getline(quelle, zeile);)
    cout &lt;&lt; zeile &lt;&lt; '\n';
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2411781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411781</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 03 Aug 2014 16:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 17:58:46 GMT]]></title><description><![CDATA[<p>OK. das ist mir nun klar.</p>
<p>Jedoch muss doch etwas mit quelle passieren, das es nachher nicht mehr true ist, sondern false. was macht getline() mit quelle, dass es nachher false ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411788</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Sun, 03 Aug 2014 17:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 18:03:35 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>OK. das ist mir nun klar.</p>
<p>Jedoch muss doch etwas mit quelle passieren, das es nachher nicht mehr true ist, sondern false. was macht getline() mit quelle, dass es nachher false ist.</p>
</blockquote>
<p>Wenn es aus der Datei nichts mehr zu lesen gibt dann ist sie im EOF-Zustand und nicht mehr good.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411790</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 03 Aug 2014 18:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 18:08:17 GMT]]></title><description><![CDATA[<p>Also gibt es im Objekt quelle so eine Art Lesezeiger für Bits oder Zeilen.<br />
Wenn der am schluss angekommen ist, ist die Datei nicht mehr good (false).</p>
<p>habe ich recht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411792</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Sun, 03 Aug 2014 18:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 18:12:22 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Also gibt es im Objekt quelle so eine Art Lesezeiger für Bits oder Zeilen.<br />
Wenn der am schluss angekommen ist, ist die Datei nicht mehr good (false).</p>
<p>habe ich recht?</p>
</blockquote>
<p>Ja, der Stream ist dann im EOF-Zustand (EOF steht für end of file) und somit nicht mehr <code>good</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411793</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 03 Aug 2014 18:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Sun, 03 Aug 2014 18:20:57 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Also gibt es im Objekt quelle so eine Art Lesezeiger für Bits oder Zeilen.<br />
Wenn der am schluss angekommen ist, ist die Datei nicht mehr good (false).</p>
<p>habe ich recht?</p>
</blockquote>
<p>Nein, falsch.</p>
<p>Ein fstream hat eine Art Lesezeiger, ja. Aber Computer arbeiten mit ganzen Bytes und Zeilen sind bloß eine Konvention für Menschen. Dieser Zeiger gibt also eine Byteposition in der Datei an.</p>
<p>Ein Dateistream ist nicht mehr &quot;good&quot;, <em>nachdem</em> ein Fehler passiert, schließlich kann das Objekt nicht in die Zukunft gucken. Das Ende zu erreichen ist kein Fehler. Über das Ende hinweg lesen ist ein Fehler. Leider sieht man sehr oft Schleifen der Art:</p>
<pre><code>while (datei.good())  // oder noch schlimmer, da es nur auf Dateiende prüft: while(!datei.eof())
{
  lese(datei, daten);
  benutze(daten);
}
</code></pre>
<p>Dies ist natürlich <strong>falsch</strong>, da man einen Lesefehler erst mitbekommt, wenn man die falschen Daten verarbeitet hat. Wenn dir das jemand so zeigt, ist das ein sicheres Zeichen, dass du von dieser Person lieber nichts über Programmierung lernen solltest. Dein Buch gehört anscheinend auch dazu.</p>
<p>Dies gilt übrigens genau so in C, Java und vielen ähnlichen Sprachen (wird dort genau so oft falsch gemacht), also kann sich niemand raus reden, dass C++ hier eine Ausnahme wäre. C++ erlaubt bloß die schicke Schreibweise:</p>
<pre><code>while(lese(datei, daten))
  benutze(daten);
</code></pre>
<p>Die man häufig so oder ähnlich verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411794</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 03 Aug 2014 18:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu while schleife on Mon, 04 Aug 2014 07:10:06 GMT]]></title><description><![CDATA[<p>Ahh ja. Ok</p>
<p>Ich habe es gecheckt.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411856</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Mon, 04 Aug 2014 07:10:06 GMT</pubDate></item></channel></rss>