<?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 ifstream]]></title><description><![CDATA[<p>hoffe jemand hat eine idee zu folgendem problem:</p>
<p>ich moechte eine text-datei einlesen via ifstream.<br />
hierbei moechte ich gerne wissen in welcher zeile ich mich gerade befinde.</p>
<p>allerdings das durch</p>
<pre><code>...
 ifstream inFile;
 inFile.open( &quot;C:\\testfile.txt&quot; );
 if (!inFile)
  return eErrFileOpen;

 // file could be opened .. let the parser do the rest 
 char c                  = 0;
 const ushort maxTokLen  = 100;
 char strTok[maxTokLen]; 
 memset(strTok,0,maxTokLen); 
 strTok[0]='\0';
 ulong cnt=0;
 while( ! (inFile.eof() || 
           inFile.bad() || 
           inFile.fail()) )
  {
//  inFile.get(c);  
    inFile &gt;&gt; strTok; 
    doSomeThing(strTok);
//    if( c=='\n' )
//      cnt++;
  }
 inFile.close();
</code></pre>
<p>Hierbei wird die datei geparst und fuers die analyse string-token-weise gelesen und komfortablerweise die newlines ueberlesen. allerdings fuer ich gerne<br />
wissen wollen in welcher zeile ich gerade einlese ohne dabei ein get(char) aufrufen zu muessen (file-pointer wird verschoben und muesste wieder rueckgesetzt werden etc.)</p>
<p>hat jemand eine idee wie man das einlesen mit dem stream operator &gt;&gt; macht aber trotzdem herausbekommt in welcher zeile man gerade ist ohne ein get(char) !?!?!?</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256587/frage-zu-ifstream</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 21:48:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256587.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Dec 2009 10:12:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to frage zu ifstream on Tue, 15 Dec 2009 10:12:20 GMT]]></title><description><![CDATA[<p>hoffe jemand hat eine idee zu folgendem problem:</p>
<p>ich moechte eine text-datei einlesen via ifstream.<br />
hierbei moechte ich gerne wissen in welcher zeile ich mich gerade befinde.</p>
<p>allerdings das durch</p>
<pre><code>...
 ifstream inFile;
 inFile.open( &quot;C:\\testfile.txt&quot; );
 if (!inFile)
  return eErrFileOpen;

 // file could be opened .. let the parser do the rest 
 char c                  = 0;
 const ushort maxTokLen  = 100;
 char strTok[maxTokLen]; 
 memset(strTok,0,maxTokLen); 
 strTok[0]='\0';
 ulong cnt=0;
 while( ! (inFile.eof() || 
           inFile.bad() || 
           inFile.fail()) )
  {
//  inFile.get(c);  
    inFile &gt;&gt; strTok; 
    doSomeThing(strTok);
//    if( c=='\n' )
//      cnt++;
  }
 inFile.close();
</code></pre>
<p>Hierbei wird die datei geparst und fuers die analyse string-token-weise gelesen und komfortablerweise die newlines ueberlesen. allerdings fuer ich gerne<br />
wissen wollen in welcher zeile ich gerade einlese ohne dabei ein get(char) aufrufen zu muessen (file-pointer wird verschoben und muesste wieder rueckgesetzt werden etc.)</p>
<p>hat jemand eine idee wie man das einlesen mit dem stream operator &gt;&gt; macht aber trotzdem herausbekommt in welcher zeile man gerade ist ohne ein get(char) !?!?!?</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822695</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 15 Dec 2009 10:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu ifstream on Tue, 15 Dec 2009 11:24:26 GMT]]></title><description><![CDATA[<p>Wenn Zeilen für dich wichtig sind, lies doch einfach zeilenweise ein, mittels getline. Die Zeile kannst du dann in einen stringstream packen, der die gleichen Operatoren kennt wie istream, wodurch du den Rest des Parsers unverändert lassen kannst<sup>*</sup>.</p>
<p><sup>*</sup>: Ich würde an deiner Stelle des rest des Parsers aber trotzdem nochmal überdenken. std::string ist dir bekannt? Und das hier:</p>
<pre><code class="language-cpp">while( ! (inFile.eof() ||
           inFile.bad() ||
           inFile.fail()) )
  {
</code></pre>
<p>Kann man auch so schreiben:</p>
<pre><code class="language-cpp">while( inFile )
  {
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822729</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu ifstream on Tue, 15 Dec 2009 20:51:33 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>hat jemand eine idee wie man das einlesen mit dem stream operator &gt;&gt; macht aber trotzdem herausbekommt in welcher zeile man gerade ist ohne ein get(char) !?!?</p>
</blockquote>
<p>Ja - die C++ iostreams sind sozusagen prädistiniert, solche Probleme zu lösen. Zwischen der Schnittstelle des von Dir verwendeten Streams (in Deinem Fall ifstream inFile) und dem darunter liegendem Streambuffer kann man einen Filter installieren durch den so zu sagen alle Zeichen einmal durch müsen. Dort zählst Du einfach die LFs.</p>
<p>Ein solcher Filter könnte so aussehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class LineCounter : public std::streambuf
{
public:
    explicit LineCounter( std::istream&amp; in )
        : m_in( in ) // istream merken, um später den Filter zu entfernen
        , m_target( in.rdbuf() )
        , m_nr( 1 ) // Start mit 1.Zeile
    {
        m_in.rdbuf( this );
    }
    ~LineCounter()
    {
        m_in.rdbuf( m_target ); // entfernt den Filter
    }
    int Nr() const { return m_nr; }

protected:
    virtual int_type underflow()
    {
        return m_target-&gt;sgetc();
    }
    virtual int_type uflow()
    {
        static const int_type LF = traits_type::to_int_type( '\n' );
        const int_type m = m_target-&gt;sbumpc();
        if( traits_type::eq_int_type( m, LF ) )
            ++m_nr;
        return m;
    }
private:
    // -- darf nicht kopiert werden, wg. Umschalten des Streambuf (s.o.)
    LineCounter( const LineCounter&amp; );
    LineCounter&amp; operator=( const LineCounter&amp; );

    // --   Member
    std::istream&amp; m_in;
    std::streambuf* m_target;
    int m_nr;
};
</code></pre>
<p>Die Anwendung sieht dann so aus, dass vor Zeile 7 Deines Programms einfach ein Objekt 'LineCounter' eingefügt wird.</p>
<pre><code class="language-cpp">LineCounter lc( inFile );
// file could be opened .. let the parser do the rest
</code></pre>
<p>Ab da lässt sich mit Hilfe von</p>
<pre><code class="language-cpp">int line = lc.Nr();
</code></pre>
<p>jederzeit die Zeile abfragen, in der sich der Lesezeiger des Files gerade befindet.</p>
<p>Wichtig: Der LineCounter muss 'out of Scope' gehen, d.h. gelöscht werden, bevor das File geschlossen wird. Im Destruktor des LineCounter wird der vorherige Streambuf des fstreams wieder hergestellt und das ist notwendig um das close auszuführen. Das erreichst Du am einfachsten dadurch, indem Du das close() in Zeile 24 weglässt. Das File wird in seinem Destruktor sowieso geschlossen und das geschieht dann erst sicher nach dem Destruktor von LineCounter.</p>
<p>Übrigens würde ich Dir in Zeile 10 dringend einen std::string empfehlen.<br />
Das 'vorher abgefrage' vorm Lesen eines Wertes ist auch überflüssig. Besser erst lesen und dann fragen, ob es gut gegangen ist. Etwa:</p>
<pre><code class="language-cpp">for( std::string strTok; inFile &gt;&gt; strTok; )
    {
        doSomeThing(strTok); // oder ggf.: doSomeThing( strTok.c_str() );
        cout &lt;&lt; &quot;aktuelle Zeile ist &quot; &lt;&lt; lc.Nr() &lt;&lt; endl;
    }
</code></pre>
<p>:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823137</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Dec 2009 20:51:33 GMT</pubDate></item></channel></rss>