<?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[wie nutze ich eof() mit einem ifstream-Objekt?]]></title><description><![CDATA[<p>Hallo miteinander.</p>
<p>Ich will lediglich eine Textdatei wie folgt einlesen, bis ihr Ende erreicht ist:</p>
<pre><code>ifstream diffDatei;
char	 buffer[MAX_CHAR];

diffDatei.open(&quot;DIFF-T-TEST-LIVE.txt&quot;);
if(diffDatei.is_open())
{
    while(diffDatei.eof())
    {
        diffDatei.getline(buffer, MAX_CHAR);
        ...
</code></pre>
<p>Allerdings liest mein Programm immer weiter. Wenn ich die Zeilen ausgeben lasse, dann erscheint nach dem eigentlichen Dateiende nix mehr auf dem Bildschirm, die Schleife läuft aber weiter. Habe die Prüfung erstmal auf</p>
<pre><code>while(diffDatei.good())
</code></pre>
<p>geändert, aber warum funktioniert das mit eof() nicht?</p>
<p>Gruß<br />
Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339553/wie-nutze-ich-eof-mit-einem-ifstream-objekt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 02:00:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339553.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Sep 2016 10:56:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 10:56:54 GMT]]></title><description><![CDATA[<p>Hallo miteinander.</p>
<p>Ich will lediglich eine Textdatei wie folgt einlesen, bis ihr Ende erreicht ist:</p>
<pre><code>ifstream diffDatei;
char	 buffer[MAX_CHAR];

diffDatei.open(&quot;DIFF-T-TEST-LIVE.txt&quot;);
if(diffDatei.is_open())
{
    while(diffDatei.eof())
    {
        diffDatei.getline(buffer, MAX_CHAR);
        ...
</code></pre>
<p>Allerdings liest mein Programm immer weiter. Wenn ich die Zeilen ausgeben lasse, dann erscheint nach dem eigentlichen Dateiende nix mehr auf dem Bildschirm, die Schleife läuft aber weiter. Habe die Prüfung erstmal auf</p>
<pre><code>while(diffDatei.good())
</code></pre>
<p>geändert, aber warum funktioniert das mit eof() nicht?</p>
<p>Gruß<br />
Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507966</guid><dc:creator><![CDATA[_Bongo]]></dc:creator><pubDate>Thu, 08 Sep 2016 10:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 11:24:01 GMT]]></title><description><![CDATA[<p>Hallo Kai,</p>
<p>da gibt es eine ganz einfache Regel, die gilt bei Streams und die gilt auch bei allen sonstigen Funktionsaufrufen.<br />
<strong>ZUERST</strong> rufst Du eine Funktion auf, und <strong>DANACH</strong> prüfst Du ob ein Fehler aufgetreten ist oder sonst was.</p>
<p>Also erst</p>
<pre><code>diffDatei.getline(buffer, MAX_CHAR);
</code></pre>
<p>und danach</p>
<pre><code>if( diffDatei.fail() ) {
        // Huston wir haben ein Problem
        if( diffDatei.eof() ) {
            // nö, wir haben bloss das Ende der Datei erreicht
</code></pre>
<p>.. Du bist nicht der erste, der das so machen will. Beispiele für erst auf EOF oder good() prüfen und dann lesen, gibt es zu Hauf' im I-Net. Aber deshalb ist es trotzdem falsch.</p>
<p>Man kann das auch schön zusammen fassen:</p>
<pre><code>for( char buffer[MAX_CHAR]; diffDatei.getline(buffer, MAX_CHAR); ) {
        // hier buffer auswerten
        ;
    }
    if( !diffDatei.eof() ) {
        // da ist ein Problem aufgetreten, was nichts mit Ende-der-Datei zu tun hat
</code></pre>
<p>BTW.: was willst Du eigentlich lesen? Dein Code schaufelt lediglich die Bytes aus der Datei in den Speicher.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507970</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 08 Sep 2016 11:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 11:41:52 GMT]]></title><description><![CDATA[<p>Hallo Werner.</p>
<p>Danke für deine schnelle Antwort. Das leuchtet dann auch ein, wenn man es mal so gut dargestellt sieht.</p>
<p>Was ich mit dem Code bezwecke? Ich muss eine Datei Zeile-für-Zeile einlesen und parsen, um den in der Datei beschriebenen Zustand ggf. bildlich darstellen zu können.</p>
<p>Habe den char-Buffer vorhin mal durch einen std::string ersetzt, damit ich das Durchsuchen von Zeilen mit string-Funktionen erledigen kann - wurde tierisch langsam, dass Programm.</p>
<p>Gruß<br />
Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507972</guid><dc:creator><![CDATA[_Bongo]]></dc:creator><pubDate>Thu, 08 Sep 2016 11:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 12:43:11 GMT]]></title><description><![CDATA[<p>Hallo Kai,</p>
<p>_Bongo schrieb:</p>
<blockquote>
<p>Was ich mit dem Code bezwecke? Ich muss eine Datei Zeile-für-Zeile einlesen und parsen, um den in der Datei beschriebenen Zustand ggf. bildlich darstellen zu können.</p>
<p>Habe den char-Buffer vorhin mal durch einen std::string ersetzt, damit ich das Durchsuchen von Zeilen mit string-Funktionen erledigen kann - wurde tierisch langsam, dass Programm.</p>
</blockquote>
<p>was hältst Du davon, den Stream gleich beim Einlesen zu parsen. Viele machen das mit string-Funktionen (die dafür nicht gemacht sind!), weil sie nicht wissen, wie das mit std::istream geht.</p>
<p>Wie ist denn das Format Deiner Datei? Kannst Du die ersten paar Zeilen mal hier einstellen?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507975</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 08 Sep 2016 12:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 13:03:43 GMT]]></title><description><![CDATA[<pre><code>OBJECT Modification &quot;Init-Tabelle&quot;(Table 50003)
{
  OBJECT-PROPERTIES
  {
    Date=29.07.13;
    Time=16:00:39;
</code></pre>
<p>Aus der ersten Zeile lese ich z.B. den Namen des Objekts, den Typ und die ID aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507978</guid><dc:creator><![CDATA[_Bongo]]></dc:creator><pubDate>Thu, 08 Sep 2016 13:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 13:41:18 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>was hältst Du davon, den Stream gleich beim Einlesen zu parsen. Viele machen das mit string-Funktionen (die dafür nicht gemacht sind!), weil sie nicht wissen, wie das mit std::istream geht.</p>
</blockquote>
<p>Ich find die C++ IStreams so geil dafür, weil da ein Parser drin ist sozusagen.</p>
<p>In Java muss ich mir jedesmal sod ermaßen einen abbrechen, dass es doch meistens einfach ist das Ganze über Strings zu machen, was dann antürlich ultra kompliziert ist und total fehleranfällig, jedoch bei dem Vorteil dass es dann auch niemand mehr versteht <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/2507980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507980</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 08 Sep 2016 13:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 16:44:50 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>was hältst Du davon, den Stream gleich beim Einlesen zu parsen. Viele machen das mit string-Funktionen (die dafür nicht gemacht sind!), weil sie nicht wissen, wie das mit std::istream geht.</p>
</blockquote>
<p>Ich find die C++ IStreams so geil dafür, weil da ein Parser drin ist sozusagen.</p>
<p>In Java muss ich mir jedesmal sod ermaßen einen abbrechen, dass es doch meistens einfach ist das Ganze über Strings zu machen, was dann antürlich ultra kompliziert ist und total fehleranfällig, jedoch bei dem Vorteil dass es dann auch niemand mehr versteht <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>Zwar OT, aber ich halte das Interface der C++-Streams zum Parsen für extrem unintuitiv und umständlich. Der ganze Facet/Locale-Boilerplate für winzige Einstellungen nervt enorm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507993</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 08 Sep 2016 16:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Thu, 08 Sep 2016 17:13:01 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Zwar OT, aber ich halte das Interface der C++-Streams zum Parsen für extrem unintuitiv und umständlich. Der ganze Facet/Locale-Boilerplate für winzige Einstellungen nervt enorm.</p>
</blockquote>
<p>Facets und Locales hab ich noch nie bei einem Parser gebraucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507998</guid><dc:creator><![CDATA[wet kisses]]></dc:creator><pubDate>Thu, 08 Sep 2016 17:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Fri, 09 Sep 2016 14:42:44 GMT]]></title><description><![CDATA[<p>_Bongo schrieb:</p>
<blockquote>
<pre><code>OBJECT Modification &quot;Init-Tabelle&quot;(Table 50003)
{
  OBJECT-PROPERTIES
  {
    Date=29.07.13;
    Time=16:00:39;
</code></pre>
<p>Aus der ersten Zeile lese ich z.B. den Namen des Objekts, den Typ und die ID aus.</p>
</blockquote>
<p>.. und das willst Du zeilenweise lesen und mit string-Funktionen zerpflücken? Bricht man sich da beim Codieren nicht die Finger?</p>
<p>Ich würde mir das im Prinzip etwa so vorstellen. Ich gehe dabei davon aus, dass alle offenen '{' mit '}' wieder geschlossen werden. (Die Typ-Namen RDR und All habe ich willkürlich gewählt.)</p>
<pre><code>#include &lt;cassert&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;string&gt;

template&lt; char C &gt;
std::istream&amp; Char( std::istream&amp; in )
{
    char c;
    if( in &gt;&gt; c &amp;&amp; c != C )
        in.setstate( std::ios_base::failbit );
    return in;
}

template&lt; char OpenC, char CloseC &gt;
struct RDR // liest einen String der mit den Zeichen OpenC und CloseC eingeschlossen ist
{
    RDR( std::string&amp; target )
        : m_target( target )
    {}

    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, RDR xx )
    {
        return getline( in &gt;&gt; Char&lt;OpenC&gt;, xx.m_target, CloseC );
    }
private:
    std::string&amp; m_target;
};

class All
{
public:
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, All&amp; rdr )
    {
        using namespace std;
        string token;
        if( in &gt;&gt; token )
        {
            if( token == &quot;OBJECT&quot; )
            {
                string typ, name, id;
                if( in &gt;&gt; typ &gt;&gt; RDR&lt;'&quot;','&quot;'&gt;( name ) &gt;&gt; RDR&lt;'(',')'&gt;( id ) )
                {
                    clog &lt;&lt; &quot;Objekt Typ=&quot; &lt;&lt; typ &lt;&lt; &quot; Name=&quot; &lt;&lt; name &lt;&lt; &quot; Id=&quot; &lt;&lt; id &lt;&lt; endl; // nur zur Demo
                    in &gt;&gt; Char&lt;'{'&gt; &gt;&gt; rdr &gt;&gt; Char&lt;'}'&gt;; // rekursiv weiter lesen!
                }
            }
            else if( token == &quot;OBJECT-PROPERTIES&quot; )
            {
                in &gt;&gt; Char&lt;'{'&gt;;
                map&lt; string, string &gt; properties;
                char c;
                for( string key, value
                        ; in &gt;&gt; c &amp;&amp; c != '}' &amp;&amp; getline( getline( in.putback(c) &gt;&gt; ws, key, '=' ) &gt;&gt; ws, value, ';' ); )
                    properties.emplace( std::move(key), std::move(value) );
                clog &lt;&lt; properties.size() &lt;&lt; &quot; Properties gelesen&quot; &lt;&lt; endl; // nur Demo
            }
            else // hier weitere 'Objekte' anfügen
            {
                cerr &lt;&lt; &quot;unbekanntes Token: &quot; &lt;&lt; token &lt;&lt; endl;
                in.setstate( ios_base::failbit );
            }
        }
        return in;
    }
};

int main()
{
    using namespace std;
    ifstream in(&quot;DIFF-T-TEST-LIVE.txt&quot;);
    assert( in.is_open() );
    All rdr;
    if( in &gt;&gt; rdr )
        clog &lt;&lt; &quot;Ok &quot; &lt;&lt; endl;
}
</code></pre>
<p>Probiere das mal aus. Bin gespannt auf Dein Feedback.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508066</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 09 Sep 2016 14:42:44 GMT</pubDate></item><item><title><![CDATA[Reply to wie nutze ich eof() mit einem ifstream-Objekt? on Wed, 21 Sep 2016 09:00:05 GMT]]></title><description><![CDATA[<p>Danke dir. Der Code sieht echt sehr übersichtlich aus. So sehr bin ich allerdings nicht in die Parse-Materie, Streamverarbeitung, usw. vertieft. Versuche mal durch den Code durchzusteigen.</p>
<p>Gruß<br />
Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509252</guid><dc:creator><![CDATA[_Bongo]]></dc:creator><pubDate>Wed, 21 Sep 2016 09:00:05 GMT</pubDate></item></channel></rss>