<?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[Leeres Element im Container]]></title><description><![CDATA[<p>Hey Leute,<br />
wie der Titel schon sagt ist mein Problem ein leerer Eintrag im Container. Mein Programm liest mittels einer Whileschleife eine art tabellenform aus, dabei ist für mich jedoch nur der eine eintrag relevant, deshal liest es schrittweise bis an diese stelle und legt das ausgelesene in den Container. Jedoch sehe ich beim Debuggen, dass da ein leerer eintrag entsteht wenn die datei zu ende ist. Könnt ihr mir sagen wie ich das umgehen kann ? oder ob es da eine bessere lösung gibt?</p>
<pre><code class="language-cpp">vector&lt;string&gt; gesamtT(20);

        while(!datei.eof())
	{
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout&lt;&lt;eingelesen;

		if(i&gt;19)
		{
			gesamtT.push_back(eingelesen);
		}
		else
		{
		gesamtT[i]=eingelesen;
		}

		datei.getline(eingelesen,100);
		cout&lt;&lt;eingelesen&lt;&lt;endl;

		++i;

	}
</code></pre>
<p>wäre auch hilfreich wenn ihr mir den Vorgang erläutern könntet warum die schleife dennoch etwas leeres einliest obwohl es doch eigentlich abbrechen sollte wenn das dateiende erreicht ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Danke schonmal <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/topic/302976/leeres-element-im-container</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 00:01:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302976.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 May 2012 13:31:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Leeres Element im Container on Wed, 02 May 2012 13:32:56 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
wie der Titel schon sagt ist mein Problem ein leerer Eintrag im Container. Mein Programm liest mittels einer Whileschleife eine art tabellenform aus, dabei ist für mich jedoch nur der eine eintrag relevant, deshal liest es schrittweise bis an diese stelle und legt das ausgelesene in den Container. Jedoch sehe ich beim Debuggen, dass da ein leerer eintrag entsteht wenn die datei zu ende ist. Könnt ihr mir sagen wie ich das umgehen kann ? oder ob es da eine bessere lösung gibt?</p>
<pre><code class="language-cpp">vector&lt;string&gt; gesamtT(20);

        while(!datei.eof())
	{
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout &lt;&lt;eingelesen;
		datei.get(eingelesen,2);
		cout&lt;&lt;eingelesen;
		datei.get(eingelesen,100,'|');
		cout&lt;&lt;eingelesen;

		if(i&gt;19)
		{
			gesamtT.push_back(eingelesen);
		}
		else
		{
		gesamtT[i]=eingelesen;
		}

		datei.getline(eingelesen,100);
		cout&lt;&lt;eingelesen&lt;&lt;endl;

		++i;

	}
</code></pre>
<p>wäre auch hilfreich wenn ihr mir den Vorgang erläutern könntet warum die schleife dennoch etwas leeres einliest obwohl es doch eigentlich abbrechen sollte wenn das dateiende erreicht ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Danke schonmal <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/2207589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207589</guid><dc:creator><![CDATA[Sc0rpe]]></dc:creator><pubDate>Wed, 02 May 2012 13:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Leeres Element im Container on Wed, 02 May 2012 13:42:14 GMT]]></title><description><![CDATA[<p>Logik falschrum (Warum macht das jeder so? Gibt es da draußen irgendein total falsches Anfägnerbuch, das jeder liest? Stimmt, das gibt es. Bist du ein &quot;C++ von A bis Z&quot;-Opfer?). eof wird wahr, nachdem du über das Ende hinweg gelesen hast, nicht wenn du vor dem Ende stehst. Daher hast du hier über das Ende gelesen, Mist erhalten, den Mist abgespeichert und dann erst die Schleife abgebrochen. Du müsstest aber erst lesen, dann prüfen ob richtig gelesen wurde und dann gegebenenfalls abspeichern.</p>
<p>Bei deiner Schreibweise ist das natürlich ein bisschen umständlich, da du nach dem letzten Lesen prüfen musst, ob der Stream noch gut ist (und dann prüf doch gleich alles, anstatt nur eof, du willst schließlich alle Fehler abfangen). Besser geht es, wenn du für deinen Datensatz einen eigenen Leseoperator definierst, dann könntest du schreiben:</p>
<pre><code class="language-cpp">datansatz data;
while ((datei &gt;&gt; data).good())  // Der Leseoperator sollte den Stream selbst zurückliefern
 speichere(data);
</code></pre>
<p>Oder kurz durch implizite Umwandlung des Streams in einen bool'schen Ausdruck:</p>
<pre><code class="language-cpp">datansatz data;
while (datei &gt;&gt; data)  // Der Stream liefert 0 bei fail(), sonst etwas ungleich 0
 speichere(data);
</code></pre>
<p>Oder damit man den datensatz schön lokal hat:</p>
<pre><code class="language-cpp">for (datensatz data; datei &gt;&gt; data; speichere(data));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207592</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 May 2012 13:42:14 GMT</pubDate></item><item><title><![CDATA[Reply to Leeres Element im Container on Wed, 02 May 2012 14:17:06 GMT]]></title><description><![CDATA[<p>ja ich hab das so mit nem buch gelernt, jedoch heißt meins &quot;Jetzt lerne ich C++ Das komplette starterkit für den einfachen einstieg in die Programmierung&quot; von Dirkl Louis ^^ .</p>
<p>So nun zum Problem, könntest du mir genauer erklären wie das mit dem leseopertator funktioniert? denn wenn ich das so eingeben wie du bekomm ich nur fehlermeldung das irgendwo n semikolon fehlt, was aber nicht fer fall ist.<br />
Denn wie du sicherlich gemerkt hast bin ich noch in der lernphase.^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207609</guid><dc:creator><![CDATA[Sc0rpe]]></dc:creator><pubDate>Wed, 02 May 2012 14:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to Leeres Element im Container on Wed, 02 May 2012 16:17:13 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if((i&gt;19)&amp;&amp;(!datei.eof()))
		{
			gesamtT.push_back(eingelesen);
		}
		else if(!datei.eof())
		{
		gesamtT[i]=eingelesen;
		}
</code></pre>
<p>Ahhh....okay nach etwa zwanzigmal lesen deiner antwort hab ich nun kapiert wie ichs machen kann, da du aber meintest dass das falsch ist und ich mich mit erlernen von c++ ja auf mein Studium vorbereiten möchte und mir keinen schlechten Stil angewöhnen möchte könntest du mir vlt. nochn Tipp geben oder ein Buch empfehlen oder irgendwas <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ?</p>
<p>Danke erstmal für deine Hilfe <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="🙂"
    /><br />
Lg Sc0rpe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207668</guid><dc:creator><![CDATA[Sc0rpe]]></dc:creator><pubDate>Wed, 02 May 2012 16:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to Leeres Element im Container on Wed, 02 May 2012 17:17:39 GMT]]></title><description><![CDATA[<p>Di übliche Technik wäre, wie schon angedeutet, den Operator &gt;&gt; mit istream und deiner Klasse zu überladen. Operatorüberladung kann man googlen, mach noch<br />
<a href="https://www.google.de/search?&amp;q=c%2B%2B%20overload%20stream%20operators" rel="nofollow">Google: c++ overload stream operators</a><br />
draus und du findest auch das was ich mit den Streams meine:</p>
<pre><code class="language-cpp">class example
{
  int a, b;
  friend std::istream &amp;operator&gt;&gt;(std::istream &amp;in, example &amp;ex)
  {
    return in &gt;&gt; ex.a &gt;&gt; ex.b;
  }
};
</code></pre>
<p>Hier geben wir fein hübsch die Referenz auf den Stream selber zurück, genau so wie es (fast) alle Lesefunktionen der Standardbibliothek aus gutem Grund machen. Daher kann man auch so hübsch <code>return in &gt;&gt; ex.a;</code> schreiben anstatt gleichbedeutend aber länger:</p>
<pre><code class="language-cpp">in &gt;&gt; ex.a;
return in;
</code></pre>
<p>Denk dir Operatorüberladung als ganz normale Funktion mit komischem Namen. Der einzige Unterschied zu normalen Funktionen ist, dass man sie anstatt<br />
mit <code>operator&gt;&gt;(stream, ex);</code> auch mit der schöneren und konsistenteren, aber gleichbedeutenden, Schreibweise <code>stream &gt;&gt; ex;</code> aufrufen kann. Das erste kann man aber auch!</p>
<p>Dann macht man eine Schleife wie in meiner ersten Antwort schon beschrieben, die so lange läuft, wie der Fehlerstatus des Streams nicht gesetzt ist. Ein Objekt wird nur dann abgespeichert, wenn das Lesen auch erfolgreich war, was man erreicht, indem man den Lesevorgang in die Schleifenbedingung packt und das Abspeichern in den Schleifenkörper. Ich habe dir oben schon erklärt wie man das kompakt als for-Schleife schreiben kann, aber ich benutze mal das anfängerfreundlichere while:</p>
<pre><code class="language-cpp">std::vector&lt;example&gt; examples;
 example ex;
 while(datei &gt;&gt; ex)   // Der obige Operator, liefert den Dateistream selber zurück. Ging das Lesen gut, wird dieser zu true, ansonsten zu false
  examples.push_back(ex); // Wenn es gut ging, abspeichern
</code></pre>
<p>Alles in allem, noch mit einem Ausgabeoperator der Symmetrie wegen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;

class example
{
  int a, b;
  friend std::istream &amp;operator&gt;&gt;(std::istream &amp;in, example &amp;ex)
  {
    return in &gt;&gt; ex.a &gt;&gt; ex.b;
  }
  friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;out, const example &amp;ex)
  {
    return out &lt;&lt; ex.a &lt;&lt; ' ' &lt;&lt; ex.b;
  }
};

int main()
{
  std::stringstream datei(&quot;1 2 3 4 5 6 7 8 9 0&quot;);
  std::vector&lt;example&gt; examples;
  for(example ex; datei &gt;&gt; ex; examples.push_back(ex));

  std::cout &lt;&lt; &quot;Gelesene Wertepaare:\n&quot;;
  for (std::vector&lt;example&gt;::iterator it = examples.begin(), end = examples.end();
       it != end; ++it)
    std::cout &lt;&lt; *it &lt;&lt; '\n';
}
</code></pre>
<p>Hier nochmal mit den gleichen Sprachmitteln die Schleife in der Form wie du sie hattest:</p>
<pre><code class="language-cpp">int main()
{
  std::stringstream datei(&quot;1 2 3 4 5 6 7 8 9 0\n&quot;); // Hier habe ich den letzten Wert mit einem Zeilenumbruch abgewschlossen
  std::vector&lt;example&gt; examples;

  while (!datei.eof())
    {
      example ex;
      datei &gt;&gt; ex;
      examples.push_back(ex);
    }

  std::cout &lt;&lt; &quot;Gelesene Wertepaare:\n&quot;;
  for (std::vector&lt;example&gt;::iterator it = examples.begin(), end = examples.end();
       it != end; ++it)
    std::cout &lt;&lt; *it &lt;&lt; '\n';
}
</code></pre>
<p>Beobachte, wie nun der letzte Wert doppelt eingefügt wird, wie ich oben erklärt habe. Dies passiert nur, wenn auf den letzten Wert noch irgendetwas folgt, wie hier der Zeilenumbruch. Was aber ziemlich normal ist in einer Datei, dass diese auf einen Zeilenumbruch endet. Erklärung warum das so ist, findest du in meiner ersten Antwort.</p>
<p>Und noch etwas wichtiges: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Besorg dir ein gutes Buch: Lieber nichts lernen, als schlecht lernen! Denn etwas falsch gelerntes vergisst man so leicht nicht. Es wird zu schlechten Angewohnheiten, die man nicht mehr los wird. Siehe zweiter Link in meiner Signatur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207703</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 May 2012 17:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Leeres Element im Container on Thu, 03 May 2012 00:04:04 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Vielen Dank für die nette, schnelle und ausführliche Hilfe <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="🙂"
    /><br />
Ich Liebe diese Forum <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="🙂"
    /><br />
Lg Sc0rpe</p>
<p>Thema kann geschlossen werden <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/2207795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207795</guid><dc:creator><![CDATA[Sc0rpe]]></dc:creator><pubDate>Thu, 03 May 2012 00:04:04 GMT</pubDate></item></channel></rss>