<?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[Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!?]]></title><description><![CDATA[<p>Hallo, ich habe mir zu Übungszwecken eine Textdatei geschrieben und wollte sie auslesen. Dabei möchte ich unerwünschte Textzeilen wie z.B. in dem Fall die Zeile ********************* löschen. Ich poste mal die Textdatei. Hab sie in googledocs erstellt, wegen Formatierung und Co.</p>
<p><a href="https://drive.google.com/file/d/0B4sSbxPEmrOdZjkwc1UxeWU3azA/edit?usp=sharing" rel="nofollow">https://drive.google.com/file/d/0B4sSbxPEmrOdZjkwc1UxeWU3azA/edit?usp=sharing</a></p>
<p>Und hier meine Lösungsansätze:</p>
<pre><code>int main()
{

	string einlesen;
	string name;
	string matrikelnummer;
	string note;
	string ueberspringe;
	fstream quelle(&quot;Noten.txt&quot;);

	for (int i = 0; i &lt; 4; i++)
	{
		getline(quelle, einlesen);
	}

	while (!quelle.eof())
	{
		int hilf;
		hilf = einlesen.find(&quot;*&quot;);		
		if (hilf != string::npos)
		{
		  einlesen.erase(hilf);		//Sollte eigentlich die Zeile   mit &quot;****&quot; löschen
		}
		getline(quelle, einlesen, ';');
		name = einlesen;

		quelle &gt;&gt; einlesen;
		einlesen.erase(einlesen.size() - 1); // Erase um Semikolon wegzukriegen
		matrikelnummer = einlesen;

		quelle &gt;&gt; einlesen;
		einlesen.erase(einlesen.size() - 1);
		note = einlesen;

		cout &lt;&lt; name &lt;&lt; endl;
		cout &lt;&lt; matrikelnummer &lt;&lt; endl;
		cout &lt;&lt; note &lt;&lt; endl;

	}
</code></pre>
<p>Was mache ich nur falsch? Ich komme einfach nicht auf die Lösung. Bitte helft mir, ich hab am Mittwoche eine Klausur. <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326948/unerwünschte-textzeile-beim-auslesen-löschen-str-erase-funktioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 20:24:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326948.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jul 2014 18:40:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 18:40:08 GMT]]></title><description><![CDATA[<p>Hallo, ich habe mir zu Übungszwecken eine Textdatei geschrieben und wollte sie auslesen. Dabei möchte ich unerwünschte Textzeilen wie z.B. in dem Fall die Zeile ********************* löschen. Ich poste mal die Textdatei. Hab sie in googledocs erstellt, wegen Formatierung und Co.</p>
<p><a href="https://drive.google.com/file/d/0B4sSbxPEmrOdZjkwc1UxeWU3azA/edit?usp=sharing" rel="nofollow">https://drive.google.com/file/d/0B4sSbxPEmrOdZjkwc1UxeWU3azA/edit?usp=sharing</a></p>
<p>Und hier meine Lösungsansätze:</p>
<pre><code>int main()
{

	string einlesen;
	string name;
	string matrikelnummer;
	string note;
	string ueberspringe;
	fstream quelle(&quot;Noten.txt&quot;);

	for (int i = 0; i &lt; 4; i++)
	{
		getline(quelle, einlesen);
	}

	while (!quelle.eof())
	{
		int hilf;
		hilf = einlesen.find(&quot;*&quot;);		
		if (hilf != string::npos)
		{
		  einlesen.erase(hilf);		//Sollte eigentlich die Zeile   mit &quot;****&quot; löschen
		}
		getline(quelle, einlesen, ';');
		name = einlesen;

		quelle &gt;&gt; einlesen;
		einlesen.erase(einlesen.size() - 1); // Erase um Semikolon wegzukriegen
		matrikelnummer = einlesen;

		quelle &gt;&gt; einlesen;
		einlesen.erase(einlesen.size() - 1);
		note = einlesen;

		cout &lt;&lt; name &lt;&lt; endl;
		cout &lt;&lt; matrikelnummer &lt;&lt; endl;
		cout &lt;&lt; note &lt;&lt; endl;

	}
</code></pre>
<p>Was mache ich nur falsch? Ich komme einfach nicht auf die Lösung. Bitte helft mir, ich hab am Mittwoche eine Klausur. <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408796</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Tue, 15 Jul 2014 18:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 20:03:58 GMT]]></title><description><![CDATA[<p>Leider ist da so ziemlich absolut alles falsch. Ich kann nicht einmal nachvollziehen, wieso du das so versuchst, wie du es tust. Du scheinst die zur Verfügung stehenden Mittel nicht verstanden zu haben. Weiterhin hast du dir ein paar falsche Techniken aus fragwürdigen Quellen abgeschaut zu haben (ich nehme mal an, dass du dir Quatsch wie <code>while(!quelle.eof())</code> nicht selber ausgedacht hast). Aber hauptsächlich scheint das Problem zu sein, dass du nicht weißt, was die von dir benutzten Funktionen überhaupt tun. Und zwar <strong>alle</strong>. Daher ist es schwer, dir weiter zu helfen, außer dir zu sagen, dass du wohl so ziemlich alles neu lernen musst.</p>
<p>Es könnte auch helfen, wenn du lernst, wie man selber solche Probleme löst. Beispielsweise könntest du mit einem Debugger (oder notfalls mit ein paar Testausgaben) leicht rausfinden, was deine Zeilen 12-15 machen. Ich weiß nicht genau, was du dir von diesen versprichst, aber ich bin mir ziemlich sicher, dass das, was wirklich passiert nicht dem entspricht, was du denkst.</p>
<p>Keines von beidem (Wiederholung des Gelernten oder Hilfe zur Selbsthilfe) wirst du bis Mittwoch auch nur ansatzweise lernen können. Das kommt davon, wenn man kurz vor knapp merkt, dass man nichts gelernt hat. Dann ist es zu spät.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408809</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Jul 2014 20:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 20:27:06 GMT]]></title><description><![CDATA[<p>Also die Zeilen 12-15 lesen die ersten 3 Zeilen der Textdatei in meinen string. da ich diese nicht verwenden möchte, tue ich nichts weiter damit. ist ja nur eine überschrift und keine Variablen. Also warum soll das falsch sein?</p>
<p>while(!quelle.eof()) führt den Anweisungsblock aus solange Daten in der Textdatei existieren.</p>
<p>Wenn ich ganz falsch liege, kannst du mich ja korrigieren aber das ist die Weise wie ich es gelernt bzw. verstanden hab.</p>
<p>Btw: die Klausur ist erst nächste Woche Mittwoch. In 8 Tagen sollte ich vllt doch noch hinkriegen eine Textdatei auszulesen. Ich brauch nur noch den richtigen Ansatz. Dafür bin ich ja hier. <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/2408812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408812</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Tue, 15 Jul 2014 20:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 20:36:04 GMT]]></title><description><![CDATA[<p>Array schrieb:</p>
<blockquote>
<p>Also die Zeilen 12-15 lesen die ersten 3 Zeilen der Textdatei in meinen string. da ich diese nicht verwenden möchte, tue ich nichts weiter damit. ist ja nur eine überschrift und keine Variablen. Also warum soll das falsch sein?</p>
</blockquote>
<p>Dann teste deine Annahme doch einmal. Gib mal aus, was du da eingelesen hast.</p>
<blockquote>
<p>while(!quelle.eof()) führt den Anweisungsblock aus solange Daten in der Textdatei existieren.</p>
</blockquote>
<p>So? Wann wird denn das eof-Flag gesetzt?</p>
<blockquote>
<p>Wenn ich ganz falsch liege, kannst du mich ja korrigieren aber das ist die Weise wie ich es gelernt bzw. verstanden hab.</p>
</blockquote>
<p>Die Frage ist, ob du falsch verstanden hast oder ob es dir eventuell sogar falsch beigebracht wurde. Wurde dir das while(!eof) so beigebracht? Das ist ein beliebter Fehler von Lehrern, die vor vierzig Jahren mal PASCAL gelernt haben und die Unterschiede zu C-artigen Sprachen nie kapiert haben. Falls ja, ist auch alles andere aus deren Mund mit Vorsicht zu genießen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408815</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Jul 2014 20:36:04 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 20:55:19 GMT]]></title><description><![CDATA[<p>Was hat das mit Unterschied zu C-artigen Sprachen zu tun?<br />
Die ganze &quot;haben fertig&quot; und &quot;haben Fehler&quot; Geschichte ist bei den <code>iostreams</code> nun wirklich etwas gewöhnungsbedürftig umgesetzt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11409">@Array</a><br />
Lies dein Programm Zeile für Zeile, und dann geh anhand einer Referenz-Doku (wie z.B. <a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a>) alle Funktionen durch die du da aufrufst. Also lies dir durch was die machen. Was sie <em>genau</em> machen.</p>
<p>Was die <code>while (!quelle.eof())</code> Sache angeht... das ist doppelt falsch. Auf den einen Fehler kommst du selbst drauf wenn du dein Programm mal soweit hast dass es keinen kompletten Unfug mehr macht.</p>
<p>Was den zweiten Fehler angeht, lies mal dahier:<br />
<a href="http://www.cplusplus.com/reference/ios/ios/good/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/good/</a><br />
<a href="http://www.cplusplus.com/reference/ios/ios/eof/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/eof/</a><br />
<a href="http://www.cplusplus.com/reference/ios/ios/bad/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/bad/</a><br />
<a href="http://www.cplusplus.com/reference/ios/ios/eof/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/eof/</a><br />
<a href="http://www.cplusplus.com/reference/ios/ios/operator_bool/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/operator_bool/</a><br />
und<br />
<a href="http://www.cplusplus.com/reference/ios/ios/operator_not/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/operator_not/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408820</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Jul 2014 20:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 21:02:15 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Was hat das mit Unterschied zu C-artigen Sprachen zu tun?<br />
Die ganze &quot;haben fertig&quot; und &quot;haben Fehler&quot; Geschichte ist bei den <code>iostreams</code> nun wirklich etwas gewöhnungsbedürftig umgesetzt.</p>
</blockquote>
<p>Ob das wohl in C genau so ist? Und in Java? Und in C#?<br />
Eigentlich fällt mir keine moderne Profisprache ein, die das eof-Flag vorzeitig setzt. Das ist nur so bei Lehrsprachen wie Pascal oder Basic anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408823</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Jul 2014 21:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 21:04:47 GMT]]></title><description><![CDATA[<p>Das ist die Ausgabe:</p>
<p>Texdatei Nr1<br />
Klausurnoten<br />
********************************************************<br />
Drücken Sie eine beliebige Taste . . .</p>
<p>Also ich habe gelernt, dass !eof() solange noch Daten gelesen werden können, bedeutet.</p>
<p>Ich hab jetzt mal danach gesucht und da steht: Das eofbit wird gesetzt, nachdem<br />
eine Leseoperation das Ende der Eingabe erreicht hat.</p>
<p>Trotzdem bringt mich das nicht groß weiter. Wenn das alles falsch ist, kannst du mir ja zeigen wie man's richtig macht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408827</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Tue, 15 Jul 2014 21:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 21:07:03 GMT]]></title><description><![CDATA[<p>Danke hustbaer, ich werde mir das nochmal genauer durchlesen und mich dann nochmal melden. <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/2408828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408828</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Tue, 15 Jul 2014 21:07:03 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Tue, 15 Jul 2014 21:21:25 GMT]]></title><description><![CDATA[<p>Array schrieb:</p>
<blockquote>
<p>Das ist die Ausgabe:</p>
<p>Texdatei Nr1<br />
Klausurnoten<br />
********************************************************<br />
Drücken Sie eine beliebige Taste . . .</p>
</blockquote>
<p>Von welchem Code? Und was folgerst du daraus?</p>
<p>Geh mal deinen kompletten Code durch und lass dir an jeder Stelle des Programmverlaufs anzeigen (vorzugsweise mit einem Debugger, zur Not mit Ausgaben), welchen Wert welche Variablen haben. Vergleiche deine Ergebnisse mit deinen Erwartungen. Du wirst feststellen, dass das vorne und hinten nicht passt.</p>
<p>Mit kleinen Korrekturen ist es jedoch in diesem Fall nicht getan. Wie hustbaer empfohlen hat, solltest du dich mal kundig machen, was die Funktionen, die du aufrufst, überhaupt genau tun (Der Operator &gt;&gt; ist auch eine <a href="http://www.cplusplus.com/reference/string/basic_string/operator%3E%3E/" rel="nofollow">dokumentierte Funktion</a>!). Danach kannst du nachdenken, wie dein Programm tatsächlich aussehen muss.</p>
<blockquote>
<p>Also ich habe gelernt, dass !eof() solange noch Daten gelesen werden können, bedeutet.</p>
<p>Ich hab jetzt mal danach gesucht und da steht: Das eofbit wird gesetzt, nachdem<br />
eine Leseoperation das Ende der Eingabe erreicht hat.</p>
<p>Trotzdem bringt mich das nicht groß weiter.</p>
</blockquote>
<p>Das heißt, deine Schleife bricht dann ab, wenn bereits eine Leseoperation fehlgeschlagen ist. Da du innerhalb deiner Schleife aber fröhlich Leseoperationen durchführt und die Ergebnisse ungeprüft verarbeitest, wirst du beim letzten Durchlauf irgendwelchen Unsinn verarbeiten, weil das Lesen fehlschlug und du erst viel zu spät darauf reagierst.</p>
<blockquote>
<p>Wenn das alles falsch ist, kannst du mir ja zeigen wie man's richtig macht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Typische Leseschleife in C-artigen Sprachen:</p>
<pre><code>while(erfolgreich(leseaktion(quelle, daten)))
  verarbeite(daten);
</code></pre>
<p>Konkret für C++ geben die meisten (aber nicht alle! Referenz nutzen!) Leseaktionen ihre Quelle (den Stream) selbst zurück. Diese könntest du dann mit eof prüfen a la <code>while(!(getline(quelle, ziel).eof()))</code> , aber die Streams werden auch automatisch in solchen Kontexten auf ihre Fehlerflags geprüft (und zwar auf alle Fehlerflags, nicht nur eof!). Also üblicherweise etwas wie:</p>
<pre><code>while(getline(quelle, ziel))
  verarbeite(ziel);
</code></pre>
<p>Oder vergleichbare Konstrukte.</p>
<p>Das ist aber tendenziell eher ein Nebenschauplatz. Was die Lesefunktionen an sich genau machen und wie Zeichenketten funktionieren ist hier erst einmal ein viel wichtigeres Thema. Das mit dem eof hast du jetzt einmal gesehen und hoffentlich gelernt. Das andere ist viel mehr für dich zu lernen und du musst dann noch lernen, wie man alles richtig zusammen fügt (das mache ich auch bewusst nicht vor, weil du es sonst nicht lernen würdest). Ich wollte nur feststellen, ob das Problem eher bei dir oder deinem Lehrer liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408833</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Jul 2014 21:21:25 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Wed, 16 Jul 2014 13:47:51 GMT]]></title><description><![CDATA[<p>Hallo Array,</p>
<p>Array schrieb:</p>
<blockquote>
<p>Also ich habe gelernt, dass !eof() solange noch Daten gelesen werden können, bedeutet.</p>
</blockquote>
<p>kannst Du uns noch mitteilen, von wem Du das gelernt hast.<br />
Sobald man zwischen Lesefehler (FAIL) und EOF unterscheiden kann, ist dies in jeder Programmiersprache falsch. Korrekt ist immer <code>if(!FAIL)</code> , aber natürlich bitteschön nach(!) dem Lesen prüfen.</p>
<p>Ich weiß, dass Code-Beispiele mit <code>while(!inputStream.eof())</code> 100-tausend-fach im I-Net zu finden sind. Dieser <a href="http://de.wikipedia.org/wiki/Hoax" rel="nofollow">Hoax</a> wird uns wohl noch alle überleben.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408881</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 16 Jul 2014 13:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Wed, 16 Jul 2014 11:14:12 GMT]]></title><description><![CDATA[<p>Wurde mir so im Tutorium beigebracht. Hab es wie du schon sagst auch schon öfter auf Seiten im Netz gelesen, deswegen hab ich das auch nicht weiter angezweifelt.</p>
<p>Also: Wenn ich das jetzt richtig verstanden hab, muss ich zuerst einen Test auf if(!quelle.good()) machen. Dieser gibt true zurück wenn eof, badbit oder failbit gesetzt werden.</p>
<pre><code>if(quelle.good())
{
getline(quelle, einlesen);

}
</code></pre>
<p>Wobei mir jetzt immer noch nicht klar ist warum ich kein getline benutzen soll. Getline liest doch eine Zeile bis zum '\n' ein und speichert sie in einlesen. Was ja mein Ziel ist, weil ich den Variablen &quot;einlesen&quot; übergebe.</p>
<p>Wenn ich dann eine Zeile in meinem String habe, kann ich den ja mittels einlesen.find(&quot;<em>&quot;) auf das Zeichen &quot;</em>&quot; überprüfen. Die Methode liefert mir die Position des ersten aufkommens des Zeichens. Statt dem einlesen.erase() hab ich eine bessere Methode gefunden, nämlich das einlesen.clear(), was mir die ganze Zeile löscht. (Ich mache die Abfrgae, falls mehrere solcher Zeichen auftauchen sollten)</p>
<p>Wenn einlesen nicht das Zeichen &quot;*&quot; hat, tue dies, andernfalls, lösche die Zeile;</p>
<pre><code>if (einlesen.find(&quot;*&quot;) == string::npos)
			{
				getline(quelle, einlesen, '\n');

				getline(quelle, einlesen, ';');
				name = einlesen;

				getline(quelle, einlesen, ';');
				matrikelnummer = einlesen;

				getline(quelle, einlesen, ';');
				note = einlesen;
			}

			else
			{
				einlesen.clear();
			}
</code></pre>
<p><a href="http://www.cplusplus.com/reference/string/string/clear/" rel="nofollow">http://www.cplusplus.com/reference/string/string/clear/</a><br />
Natürlich funktioniert es immer noch nicht. Ich werde mir das nochmal genauer ansehen aber kann mir mal nicht jemand genau sagen warum ich was nicht benutzt soll bzw. in dem Fall falsch ist? Das würde mich schon ziemlich weiterbringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408897</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Wed, 16 Jul 2014 11:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Wed, 16 Jul 2014 14:35:16 GMT]]></title><description><![CDATA[<p>Hallo Array,</p>
<p>Array schrieb:</p>
<blockquote>
<p>Also: Wenn ich das jetzt richtig verstanden hab, muss ich zuerst einen Test auf if(!quelle.good()) machen. Dieser gibt true zurück wenn eof, badbit oder failbit gesetzt werden.</p>
<pre><code>if(quelle.good())
{
getline(quelle, einlesen);

}
</code></pre>
</blockquote>
<p>Nö</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Korrekt ist immer <code>if(!FAIL)</code> , aber natürlich bitteschön <strong>nach(!)</strong> dem Lesen prüfen.</p>
</blockquote>
<p>Also genau wie SeppJ schon ausgeführt hat:</p>
<pre><code>if( getline(quelle, einlesen) ) { // bzw. while( getline(quelle, einlesen) )
         // 'einlesen' bearbeiten
</code></pre>
<p><code>getline</code> gibt hier eine Referenz auf ' <code>quelle</code> ' zurück und die Abfrage ( <code>if</code> oder <code>while</code> ) liefert ein <code>!quelle.fail()</code> .. und natürlich nachdem(!) versucht wurde einen Zeile aus ' <code>quelle</code> ' zu lesen!<br />
Übrigens kann der Input Stream dann auch nach EOF gehen, d.h. ein quelle.eof() würde true liefern, nämlich genau dann, wenn die letzte Zeile nicht mit einem LF(Linefeed) abgeschlossen ist. Trotzdem ist das eine Zeile und die Lese-Operation war Ok.</p>
<p>Array schrieb:</p>
<blockquote>
<p>Wurde mir so im Tutorium beigebracht.</p>
</blockquote>
<p>Schönen Gruß an Deinen Dozenten, dann kläre ihn mal auf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Array schrieb:</p>
<blockquote>
<p>Wobei mir jetzt immer noch nicht klar ist warum ich kein getline benutzen soll.</p>
</blockquote>
<p>Weil Du in Deinem Beispiel zumindest am Anfang <code>getline</code> zum Überspringen von Zeilen einsetzt, nicht zum Lesen. Hier wäre eine <a href="http://www.cplusplus.com/reference/istream/istream/ignore/" rel="nofollow">ignore</a> angebracht.<br />
<code>getline</code> liest auch wirklich jede Zeile - also auch Leerzeilen - u.U. ist hier immer ein <code>quelle &gt;&gt; std::ws</code> vor dem <code>getline</code> angebracht, was alle Leerzeichen, Leerräume und Tabs überliest.<br />
Ich kann Deine Datei leider nicht öffnen, daher weiß ich nicht was Du lesen möchtest.</p>
<p>Das <code>erase</code> in Zeile 23 löscht nur ein Zeichen in <code>einlesen</code> , aber nie die Zeile. <code>erase</code> ist hier eine Methode von <code>std::string</code> , da <code>einlesen</code> ein <code>std::string</code> ist.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408947</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 16 Jul 2014 14:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Wed, 16 Jul 2014 20:56:01 GMT]]></title><description><![CDATA[<p>.. inzwischen konnte ich Deine Datei lesen. Ich habe Dir das hier mal skizziert, wie man diese Daten einliest. Wobei ich mich an Deinen Code angelehnt habe .. in produktivem Code würde man das wohl noch etwas anders machen, aber ich wollte das nicht überfrachten.</p>
<p>Melde Dich doch bitte und sage uns, wie Du damit zurecht kommst.</p>
<p>Gruß<br />
Werner</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;limits&gt; // numeric_limits&lt;&gt;

int main()
{
    using namespace std;
    const std::streamsize ALLES = numeric_limits&lt; streamsize &gt;::max();

    ifstream quelle(&quot;Noten.txt&quot;);   // [i]fstream reicht
    if( !quelle.is_open() ) // IMMER prüfen, in 80% aller Fehlerfälle kann die Datei nicht gefunden werden!
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei&quot; &lt;&lt; endl;
        return -2;
    }

    for( int zeile=0; zeile&lt;4; ++zeile )
        quelle.ignore( ALLES, '\n' );   // überspringe die Zeile

    string name;
    string matrikelnummer;
    double note;
    char c;
    while( quelle &gt;&gt; c ) // bricht ab bei Lesefehler
    {
        // auf '*' prüfen
        if( c == '*' )
        {
            quelle.ignore( ALLES, '\n' );   // Kommentar überspringen
            continue; // oder break; ??
        }
        quelle.putback( c ); // wieder zurück in den Stream, wir brauchen das Zeichen noch!
        getline( quelle, name, ';' );
        getline( quelle &gt;&gt; ws, matrikelnummer, ';' ); // das 'ws' überliest das Leerzeichen vor 'matrikelnummer'
        quelle &gt;&gt; note;
        quelle.ignore( ALLES, '\n' ); // und den Rest der Zeile wieder überspringen

        // jetzt erst prüfen, ob das alles ok war!
        if( quelle )
        {   // hier kannst Du jetzt sicher sein, dass alle Variablen korrekt eingelesen wurden
            cout &lt;&lt; name &lt;&lt; &quot;; &quot; &lt;&lt; matrikelnummer &lt;&lt; &quot;; &quot; &lt;&lt; note &lt;&lt; endl;
        }
        else
            break;  // Lesefehler, also Schleife beenden
    }
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2409023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409023</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 16 Jul 2014 20:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Thu, 17 Jul 2014 10:25:49 GMT]]></title><description><![CDATA[<p>Vielen Dank, Werner. Ich habe das Programm gleich mal getestet. Werde es aber mit dem Debugger nochmal durchgehen müssen und mir 1-2 Funktionen nochmal genauer anschauen um es richtig zu verstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409069</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Thu, 17 Jul 2014 10:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Fri, 18 Jul 2014 20:57:00 GMT]]></title><description><![CDATA[<p>Hallo Werner, ich habe mich jetzt länger mit Dateiverarbeitung beschäftigt und Recht hattet ihr. Ich überprüfe jetzt immer erst ob auf if(!quelle.is_open()) und in der while-Schleife mache ich die Überprüfung auf while(quelle.good()) und in dieser dann erst die Prüfung auf while(!quelle.eof()). Das hat mir sehr viel Zeit und Fehler erspart. Vielen Dank erstmal für die hilfreichen Tipps. <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>
<p>Nur habe ich das mit den limits nicht ganz verstanden. Könntest du mir das vielleicht noch erklären?</p>
<blockquote>
<p>#include &lt;iostream&gt;<br />
#include &lt;fstream&gt;<br />
#include &lt;string&gt;<br />
#include &lt;limits&gt; // numeric_limits&lt;&gt;</p>
<p>using namespace std;<br />
const std::streamsize ALLES = numeric_limits&lt; streamsize &gt;::max();</p>
<p>for( int zeile=0; zeile&lt;4; ++zeile )<br />
quelle.ignore( ALLES, '\n' ); // überspringe die Zeile</p>
<p>while( quelle &gt;&gt; c ) // bricht ab bei Lesefehler<br />
{<br />
// auf '<em>' prüfen<br />
if( c == '</em>' )<br />
{<br />
quelle.ignore( ALLES, '\n' ); // Kommentar überspringen<br />
continue; // oder break; ??<br />
}</p>
</blockquote>
<p>Und dann evtl. noch diese Zeile?<br />
Warum wird das genau gemacht, was bewirkt es in diesem Fall konkret?</p>
<blockquote>
<p>quelle.putback( c ); // wieder zurück in den Stream, wir brauchen das Zeichen noch!</p>
<p>}</p>
</blockquote>
<p>Vielen Dank 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/2409318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409318</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Fri, 18 Jul 2014 20:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Sun, 20 Jul 2014 11:41:37 GMT]]></title><description><![CDATA[<p>Hallo Array,</p>
<p>Array schrieb:</p>
<blockquote>
<p>Nur habe ich das mit den limits nicht ganz verstanden. Könntest du mir das vielleicht noch erklären?</p>
</blockquote>
<p>Es gibt die Methode <a href="http://www.cplusplus.com/reference/istream/istream/ignore/" rel="nofollow">ignore</a>. Mit dem ersten Parameter gibst Du die Anzahl der Zeichen an, die Du maximal ignorieren bzw. überlesen möchtest. Für den Fall dass dort die größte für diesen Typ darzustellende Zahl steht, heißt das so viel wie 'unendlich'. D.h. dann ist die Anzahl nicht begrenzt und <code>ignore</code> arbeitet sich bis zu dem Zeichnen durch, welches gleich dem zweiten Parameter (hier '\n' bzw. EOL bzw. End-Of-Line) ist oder eben bis zum Ende der Datei.</p>
<p>Da es in C++ keine eindeutige Festlegung gibt, wie groß so ein Typ werden kann, gibt es die Struktur <a href="http://www.cplusplus.com/reference/limits/numeric_limits/?kw=numeric_limits" rel="nofollow">std::numeric_limits</a>. Dort kann man verschieden Eigenschaften arithmetischer Typen abfragen.<br />
Und <code>std::numeric_limits&lt;std::streamsize&gt;::max()</code> liefert eben die größte Zahl, die mit dem Typ <code>std::streamsize</code> darstellbar ist. Das ist bei einem 32Bit-System i.A. =2147483647 (=0x7FFFFFFF); kann bei einem 64Bit-System aber auch =9223372036854775807 (=0x7FFFFFFFFFFFFFFF) sein.</p>
<p>Array schrieb:</p>
<blockquote>
<p>Und dann evtl. noch diese Zeile?<br />
Warum wird das genau gemacht, was bewirkt es in diesem Fall konkret?</p>
<blockquote>
<p>quelle.putback( c ); // wieder zurück in den Stream, wir brauchen das Zeichen noch!</p>
</blockquote>
</blockquote>
<p>Schau hier nach: <a href="http://www.cplusplus.com/reference/istream/istream/putback/" rel="nofollow">putback</a>; oder lass die Zeile mal weg und schau Dir an, was dann passiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> . putback stellt das Zeichen 'c' wieder zurück, so dass es noch einmal gelesen werden kann. Zu beachten ist, dass das nicht beliebig oft geht! Am zuverlässigsten funktioniert es, wenn Du vorher genau ein Zeichen mit ' <code>quelle &gt;&gt; c</code> ' gelesen hast; das ist hier der Fall.</p>
<p>Array schrieb:</p>
<blockquote>
<p>.. Ich überprüfe jetzt immer erst ob auf if(!quelle.is_open()) und in der while-Schleife mache ich die Überprüfung auf while(quelle.good()) und in dieser dann erst die Prüfung auf while(!quelle.eof()).</p>
</blockquote>
<p>Hm! - noch mal zur Klarstellung: Im Prinzip sollte ein Code zum Lesen immer so aussehen:</p>
<pre><code>Datei öffnen
    prüfen mit is_open()

    Schleife // ggf. for(;;)
       Lesen eines vollständigen Eintrags (hier von name bis note)
       // und jetzt erst:
       if( quelle )   // bzw. if( !quelle.fail() ) // ist das gleiche
           Ok, eingelesene Daten verwenden
       else
           Einlesen beenden
    Ende der Schleife
    // Wenn eine Datei bis zum Ende gelesen werden soll, dann und nur dann
    if( quelle.eof() )
        Ok, Datei bis zum Enden gelesen
</code></pre>
<p>Der Schleifenkopf inklusive Lesen plus prüfen, lässt sich in eine einzige Zeile zusammen fassen, wenn man Name, Matrikelnummer und die Note in einer Struktur 'Eintrag' zusammen fasst - etwa so</p>
<pre><code>Eintrag eintrag;
    while( quelle &gt;&gt; eintrag ) {
        .. eingelesene Daten 'eintrag' verwenden
</code></pre>
<p>Gleichwertig ist:</p>
<pre><code>for( Eintrag eintrag; quelle &gt;&gt; eintrag; ) {
        .. eingelesene Daten 'eintrag' verwenden
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409509</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 20 Jul 2014 11:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Textzeile beim auslesen löschen - str.erase() funktioniert nicht!? on Mon, 21 Jul 2014 17:05:47 GMT]]></title><description><![CDATA[<p>Vielen lieben Dank an alle und vor allem dir Werner! Das hat mich wirklich weiter gebracht. Jetzt muss ich nur noch das mit dem überladen des Ausgabeoperators lernen und dann kann die Klausur auch kommen. <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/2409785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409785</guid><dc:creator><![CDATA[Array 0]]></dc:creator><pubDate>Mon, 21 Jul 2014 17:05:47 GMT</pubDate></item></channel></rss>