<?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[Probleme beim auslesen einer Textdatei]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich lese eine Textdatei mit folgender Funktion aus:</p>
<pre><code class="language-cpp">// loads fragments from file: 
bool Assembler::load (const std::string&amp; filename)
{
	std::string tmp_string;
	std::ifstream inputFile (filename.c_str());

	// Error if file coud not be opened: 
	if (inputFile.fail()) std::cerr &lt;&lt; &quot;Konnte die Datei  \&quot;&quot; &lt;&lt; filename &lt;&lt; &quot;\&quot; nicht oeffnen.&quot; &lt;&lt; std::endl;

	// read file: 
	while (!inputFile.eof() &amp;&amp; !inputFile.fail())
	{
		getline (inputFile, tmp_string);
		fragments_.push_back(tmp_string);
	}

	// operation successful?: 
	return !inputFile.fail();
}
</code></pre>
<p>Das funktioniert ganz gut. Das Problem ist jetzt, dass die Funktion false zurückgibt, wenn am Ende noch eine Leerzeile steht. Wie kann ich das abfangen (das Auslesen war dann ja erfolgreich)?</p>
<p>Vielen Dank<br />
- Egg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125509/probleme-beim-auslesen-einer-textdatei</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 03:02:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125509.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Nov 2005 09:49:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 09:51:01 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich lese eine Textdatei mit folgender Funktion aus:</p>
<pre><code class="language-cpp">// loads fragments from file: 
bool Assembler::load (const std::string&amp; filename)
{
	std::string tmp_string;
	std::ifstream inputFile (filename.c_str());

	// Error if file coud not be opened: 
	if (inputFile.fail()) std::cerr &lt;&lt; &quot;Konnte die Datei  \&quot;&quot; &lt;&lt; filename &lt;&lt; &quot;\&quot; nicht oeffnen.&quot; &lt;&lt; std::endl;

	// read file: 
	while (!inputFile.eof() &amp;&amp; !inputFile.fail())
	{
		getline (inputFile, tmp_string);
		fragments_.push_back(tmp_string);
	}

	// operation successful?: 
	return !inputFile.fail();
}
</code></pre>
<p>Das funktioniert ganz gut. Das Problem ist jetzt, dass die Funktion false zurückgibt, wenn am Ende noch eine Leerzeile steht. Wie kann ich das abfangen (das Auslesen war dann ja erfolgreich)?</p>
<p>Vielen Dank<br />
- Egg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910321</guid><dc:creator><![CDATA[Egg]]></dc:creator><pubDate>Mon, 07 Nov 2005 09:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 10:25:03 GMT]]></title><description><![CDATA[<p>Also zu lesen bis eof() true zurück gibt ist nicht gerade eine gute idee. Da das eof dann mitgelesen wird. Und der stream dann bei fail() immer true zurückgibt.</p>
<p>Versuche es einfach mal so:</p>
<pre><code class="language-cpp">// loads fragments from file:
bool Assembler::load (const std::string&amp; filename)
{
    std::string tmp_string;
    std::ifstream inputFile (filename.c_str());

    // Error if file coud not be opened:
    if (!inputFile) 
    {
        std::cerr &lt;&lt; &quot;Konnte die Datei  \&quot;&quot; &lt;&lt; filename &lt;&lt; &quot;\&quot; nicht oeffnen.&quot; &lt;&lt; std::endl;
        return false;
    }

    // read file:
    while (getline (inputFile, tmp_string))
        fragments_.push_back(tmp_string);

    // operation successful?:
    return inputFile.good(); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/910363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910363</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Mon, 07 Nov 2005 10:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 11:12:25 GMT]]></title><description><![CDATA[<p>Die Idee ist gut. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910417</guid><dc:creator><![CDATA[Egg]]></dc:creator><pubDate>Mon, 07 Nov 2005 11:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 12:32:06 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// read file:
    while (getline (inputFile, tmp_string))
        fragments_.push_back(tmp_string);
   
    // operation successful?:
    return inputFile.good(); 
}
</code></pre>
</blockquote>
<p>lt. Standard gibt diese Methode IMMER 'false' zurück. Die Funtion getline liefert den Stream - also 'inputFile' - dieser ist in eine bool-Variable konvertierbar und liefert !fail(). Folglich endet die while-Schleife, wenn der Stream auf fail geht - also z.B. wenn über das Ende hinaus gelesen wird. Ein Stream mit gesetztem fail-Bit ist nie good.</p>
<p>Vorschlag: lese am Ende einer Zeile alle white-space-Character und prüfe dann auf eof-Bit.</p>
<pre><code class="language-cpp">do
    {
        getline (inputFile, tmp_string);
        // ...
    }
    while( inputFile.good() &amp;&amp; !(inputFile &gt;&gt; std::ws).eof() );

    return !inputFile.fail();
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910481</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Nov 2005 12:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 13:39:04 GMT]]></title><description><![CDATA[<p>Hallo Werner</p>
<p>Bei deiner Variante bricht er aber mit nem Zeilenumbruch am Ende der Datei ab und gibt false zurück...</p>
<p>Grüße<br />
- Egg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910553</guid><dc:creator><![CDATA[Egg]]></dc:creator><pubDate>Mon, 07 Nov 2005 13:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 15:29:55 GMT]]></title><description><![CDATA[<p>Egg schrieb:</p>
<blockquote>
<p>Bei deiner Variante bricht er aber mit nem Zeilenumbruch am Ende der Datei ab und gibt false zurück...</p>
</blockquote>
<p>Funktioniert der Vorschlag von evilissimo bei Dir?</p>
<p>Ich habe es mit dem MS VC6 und MS VC7 ausprobiert. Meine Variante funktioniert in beiden Umgebungen. Ich könnte mir vorstellen, dass der Aufruf von std::ws einen Fehler verursachen könnte, wenn der Lese-Zeiger bereits auf EOF steht, obwohl das eof-Bit noch nicht gesetzt ist.<br />
Welche Umgebung benutzt Du?</p>
<p>Gruß<br />
Werner<br />
PS.: muss weg; antworte ggf. später</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910694</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Nov 2005 15:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 16:40:36 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich benutze Cygwin. Folgenden Code benutze ich jetzt der funktioniert.</p>
<pre><code class="language-cpp">// loads fragments from file: 
bool Assembler::load (const std::string&amp; filename)
{
	std::string tmp_string;
	std::ifstream inputFile (filename.c_str());

	// Error if file coud not be opened: 
	if (!inputFile) return false;

	// read file: 
	while (getline (inputFile, tmp_string))
	{
		// if line is not empty, save fragment: 
		if (tmp_string != &quot;&quot;) {fragments_.push_back(tmp_string);}
	}

	return true;
}
</code></pre>
<p>Meint ihr das kann man so lassen? Ich meine eine leere Zeile ist ja im Prinzip immer &quot;&quot; wenn keine Leerzeichen drinstehen - und das kann ich ausschließen.<br />
Wenn ich &quot;return false;&quot; mache verlässt er ja die Funktion, nicht?</p>
<p>Grüße<br />
- Egg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910764</guid><dc:creator><![CDATA[Egg]]></dc:creator><pubDate>Mon, 07 Nov 2005 16:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 17:13:49 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon<br />
warum nicht einfach:</p>
<pre><code class="language-cpp">while (getline (inputFile, tmp_string))
{
    // if line is not empty, save fragment: 
    if (tmp_string != &quot;&quot;) {fragments_.push_back(tmp_string);}
}
return inputFile.eof();
</code></pre>
<p>Wenn ich am Ende der Schleife bin, dann weiß ich, dass fail() true liefer, also das entweder das fail- oder das bad-bit gesetzt ist. Das kann drei Gründe haben: a) Formatfehler (setzt failbit) b) schwerwiegender I/O-Fehler (setzt badbit) c) Leseversuch wurde wegen End-of-File abgebrochen (setzt failbit nachdem zuvor eofbit gesetzt wurde)</p>
<p>Wenn letzteres gilt, weiß ich, dass vorher nicht ersteres und zweiteres galt. Also kann ich in diesem Fall true liefern, da alle Daten gelesen wurden.<br />
Wurde die Schleife hingen wegen a) oder b) abgebrochen, dann kann c) nicht gelten und ich habe auf jeden Fall nicht die ganze Eingabe verarbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910795</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 07 Nov 2005 17:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim auslesen einer Textdatei on Mon, 07 Nov 2005 21:28:49 GMT]]></title><description><![CDATA[<p>Hallo Hume, Hallo Egg</p>
<p>im Prinzip gebe ich Hume recht. Wenn innerhalb von Stream und darunterliegenden Streambuf alles richtig läuft, sollte Dein Vorschlag funktionieren. Trotzdem würde ich eher zu der Lösung tendieren, die Egg als letztes vorgeschlagen hat.<br />
Das Lesen bis zum 'bitteren' Ende ist in der Praxis nicht immer vom &quot;Lesen bis ein Fehler auftritt&quot; zu unterscheiden. Ich habe selber einige Derivate von Streambuf entwickelt und es werfen nicht alle eine Exception (setzt bad-Bit), wenn das darunterliegende Device einen fatalen Fehler hat. Es werden manchmal einfach keine Zeichen mehr geliefert und das heißt nunmal EOF.</p>
<p>BTW: Ich habe es inzwischen auch unter MinGW 3.2.0 ausprobiert. Auch da funktioniert das mit '&gt;&gt; std::ws' wie erwartet.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911169</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Nov 2005 21:28:49 GMT</pubDate></item></channel></rss>