<?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[Datei einlesen, Inhalt vom Header trennen und in Array Speichern]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Mein Problem klingt wahrscheinlich total simpel, aber ich tu mich irgendwie sehr schwer daran.<br />
Ich habe eine Dateien, welche in einem festen Format vorliegen, welches ich nicht beeinflussen kann. Ich muss also sozusagen damit leben.<br />
Die Dateien haben ungefähr folgenden Aufbau:</p>
<pre><code>Header
Hier stehen paar Sachen drin...
Die Zeilen sind zwar unterschiedlich lang...
Aber die Anzahl der Zeilen im Header ist gleich...
Danach kommen die &quot;nutzdaten&quot;

\t  \t  1.5 \t  \t
\t  1.2 0.0 1.3 \t
\t  \t  1.0 \t  \t
</code></pre>
<p>Nach dem Header kommt also eine Art Array von double-Zahlen. Diese sind in Zeilen und Spalten angeordnet. Die Spalten sind jeweils durch einen Tabulator voneinander getrennt.<br />
Das Problem ist nun, überall wo der Wert 0.0 stehen würde, steht gar nichts hin. Obiges double-Array steht also eigentlich für:</p>
<pre><code>0.0 0.0 1.5 0.0 0.0
0.0 1.2 0.0 1.3 0.0
0.0 0.0 1.0 0.0 0.0
</code></pre>
<p>Mein erster Gedanke war, dass gleich als eine Art Struktur einlesen zu lassen. Aber das geht ja so richtig nur, wenn der Inhalt binär vorliegt.<br />
Dann wollte ich das &quot;einfach&quot; über</p>
<pre><code class="language-cpp">ifstream File(&quot;Datei.txt&quot;);
string s;
...
File &gt;&gt; s;
... 
File.close();
</code></pre>
<p>einlesen (ist jetzt nur schematisch zu verstehn).<br />
So habe ich aber das Problem, dass die Felder in denen nichts als nen Tab steht &quot;übersprungen&quot; werden.<br />
Wenn ich also das Array nacheinander einlese, bekomme ich nur 1.5, 1.2, 1.3 und 1.0. Ich verliere also sämtliche Nullen und auch die Positionen, wo sie sind.</p>
<p>Hat vielleicht jemand nen guten Tipp für mich? <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/275404/datei-einlesen-inhalt-vom-header-trennen-und-in-array-speichern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 02:38:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275404.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Oct 2010 07:30:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei einlesen, Inhalt vom Header trennen und in Array Speichern on Thu, 14 Oct 2010 07:31:22 GMT]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Mein Problem klingt wahrscheinlich total simpel, aber ich tu mich irgendwie sehr schwer daran.<br />
Ich habe eine Dateien, welche in einem festen Format vorliegen, welches ich nicht beeinflussen kann. Ich muss also sozusagen damit leben.<br />
Die Dateien haben ungefähr folgenden Aufbau:</p>
<pre><code>Header
Hier stehen paar Sachen drin...
Die Zeilen sind zwar unterschiedlich lang...
Aber die Anzahl der Zeilen im Header ist gleich...
Danach kommen die &quot;nutzdaten&quot;

\t  \t  1.5 \t  \t
\t  1.2 0.0 1.3 \t
\t  \t  1.0 \t  \t
</code></pre>
<p>Nach dem Header kommt also eine Art Array von double-Zahlen. Diese sind in Zeilen und Spalten angeordnet. Die Spalten sind jeweils durch einen Tabulator voneinander getrennt.<br />
Das Problem ist nun, überall wo der Wert 0.0 stehen würde, steht gar nichts hin. Obiges double-Array steht also eigentlich für:</p>
<pre><code>0.0 0.0 1.5 0.0 0.0
0.0 1.2 0.0 1.3 0.0
0.0 0.0 1.0 0.0 0.0
</code></pre>
<p>Mein erster Gedanke war, dass gleich als eine Art Struktur einlesen zu lassen. Aber das geht ja so richtig nur, wenn der Inhalt binär vorliegt.<br />
Dann wollte ich das &quot;einfach&quot; über</p>
<pre><code class="language-cpp">ifstream File(&quot;Datei.txt&quot;);
string s;
...
File &gt;&gt; s;
... 
File.close();
</code></pre>
<p>einlesen (ist jetzt nur schematisch zu verstehn).<br />
So habe ich aber das Problem, dass die Felder in denen nichts als nen Tab steht &quot;übersprungen&quot; werden.<br />
Wenn ich also das Array nacheinander einlese, bekomme ich nur 1.5, 1.2, 1.3 und 1.0. Ich verliere also sämtliche Nullen und auch die Positionen, wo sie sind.</p>
<p>Hat vielleicht jemand nen guten Tipp für mich? <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/1965389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965389</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Thu, 14 Oct 2010 07:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to Datei einlesen, Inhalt vom Header trennen und in Array Speichern on Thu, 14 Oct 2010 09:22:54 GMT]]></title><description><![CDATA[<p>Bei der Funktion getline kannst du Trennzeichen angeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965425</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Oct 2010 09:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Datei einlesen, Inhalt vom Header trennen und in Array Speichern on Thu, 14 Oct 2010 11:13:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Bei der Funktion getline kannst du Trennzeichen angeben...</p>
</blockquote>
<p>.. dieser automatische Reflex auf das Schlüsselwort 'Datei einlesen' oder 'einlesen' mit 'getline' zu reagieren, empfinde ich langsam als ziemlich nervig.</p>
<p>Nix für ungut SeppJ, ansonsten schätze ich Deine Beiträge durchaus. <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>Das Überlesen von Zeilen macht man mit ignore - ein Code Schnipsel dazu:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;limits&gt; // numeric_limits

namespace
{
    const std::streamsize ALL = std::numeric_limits&lt; std::streamsize &gt;::max();
}

int main()
{
    using namespace std;

    ifstream File(&quot;Datei.txt&quot;);
    const int anzahlZeilenImHeader = 5;
    for( int i=0; i &lt; anzahlZeilenImHeader; ++i )
        File.ignore( ALL, '\n' ); // Zeile bis LF überlesen

    // usw.
</code></pre>
<p>Das mit dem Lesen der leeren(!) Tabulatoren ist schwieriger, da der Tabulator zu den <a href="http://de.wikipedia.org/wiki/Leerraum" rel="nofollow">White Space Zeichen</a> gehört und der std::istream von Haus aus alle White Space gleich behandelt. Überlege ich mir noch ...</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965485</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 14 Oct 2010 11:13:34 GMT</pubDate></item><item><title><![CDATA[Reply to Datei einlesen, Inhalt vom Header trennen und in Array Speichern on Thu, 14 Oct 2010 20:32:33 GMT]]></title><description><![CDATA[<p>Hallo Mandel,</p>
<p>ich habe zwei Helferlein gebastelt. Zum einen 'tab', was ein Tabulator-Zeichen einliest und die Abfrage 'is_number', welche true liefert, wenn ein Zeichen folgt, dass eine Zahl einleiten könnte. Damit kann man dann relativ einfach die von Dir beschriebene Datei einlesen (s. main).</p>
<p>Damit das funktioniert, muss vor jeder potentiellen Zahl (auch der in der ersten Spalte) ein TAB stehen - unabhängig davon, ob danach eine Zahl kommt oder nicht. Weiter gehe ich davon aus, dass die Anzahl der Spalten vor dem Einlesen bekannt ist (im Programm unten == 5).</p>
<p>Hier der gesamte Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;limits&gt; // numeric_limits

// --   liest das nächste Tabulator-Zeichen ein
//      falls keines gefunden wurde, oder Text folgt, so wird der Stream auf FAIL gesetzt
template&lt; typename E, typename Traits &gt;
std::basic_istream&lt; E, Traits &gt;&amp; tab( std::basic_istream&lt; E, Traits &gt;&amp; in )
{
    std::basic_istream&lt; E, Traits &gt;::sentry ok( in, true ); // true := noskip white space
    if( ok )
    {
        const std::ctype&lt; E &gt;&amp; ctype_ = std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() );
        for( std::basic_istream&lt; E, Traits &gt;::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
        {
            if( Traits::eq_int_type( m, Traits::eof() ) )
            {
                in.setstate( std::ios_base::eofbit | std::ios_base::failbit );
                break;  // EOF ist hier auch Fehler, da ein Tab gelesen werden soll
            }
            const E c = Traits::to_char_type( m );
            if( c == in.widen( '\t' ) )
            {
                in.rdbuf()-&gt;sbumpc(); // Tabulator konsumieren
                break; // ok, Tab gelesen
            }
            if( !ctype_.is( std::ctype_base::space, c ) )
            {
                in.setstate( std::ios_base::failbit );
                break;  // .. es folgt ein Text -&gt; das ist wäre hier ein Fehler - oder?!
            }
        }
    }
    return in;
}

// --   liefert true, wenn im unmittelbar folgenden Zeichen des Streams 'in'
//      ein Zeichen folgt, welches zu einem numerischen Ausdruck gehören könnte.
//      e := { Digit, Vorzeichen, Dezimalpunkt }
//      Es wird kein Zeichen konsumiert (d.h. eingelesen).
//      Ist das aktuelle Zeichen das letzte im Stream, so wird EOF gesetzt.
//      Ist EOF bereits gesetzt, so geht der Stream auf FAIL (s. istream::sentry).
template&lt; typename E, typename Traits &gt;
bool is_number( std::basic_istream&lt; E, Traits &gt;&amp; in )
{
    std::basic_istream&lt; E, Traits &gt;::sentry ok( in, true ); // true := noskip white space
    if( ok )
    {
        const std::basic_istream&lt; E, Traits &gt;::int_type m = in.rdbuf()-&gt;sgetc();
        if( Traits::eq_int_type( m, Traits::eof() ) )
        {
            in.setstate( std::ios_base::eofbit );
            return false;
        }
        const E c = Traits::to_char_type( m );
        return std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() ).is( std::ctype_base::digit, c ) 
            || c == in.widen('-') || c == in.widen('+') 
            || c == std::use_facet&lt; std::numpunct&lt; E &gt; &gt;( in.getloc() ).decimal_point();
    }
    return false;
}

namespace
{
    const std::streamsize ALL = std::numeric_limits&lt; std::streamsize &gt;::max();
}

int main()
{
    using namespace std;

    ifstream File(&quot;Datei.txt&quot;);
    if( !File.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei&quot; &lt;&lt; endl;
        return -1;
    }
    // --   Header überlesen
    const int anzahlZeilenImHeader = 6;
    for( int i=0; i &lt; anzahlZeilenImHeader; ++i )
        File.ignore( ALL, '\n' ); // Zeile bis LF überlesen

    // --   Tabelle einlesen; bis Fehler oder Ende
    for( int zeile = 0; File; ++zeile )
    {
        for( int spalte = 0; spalte &lt; 5; ++spalte ) // mal angenommen es sind 5 Spalten!
        {
            double num = 0.0;   // Defaultwert, falls keine Zahl in der Datei steht
            if( File &gt;&gt; tab &amp;&amp; (!is_number( File ) || File &gt;&gt; num) )
            {
                cout &lt;&lt; '\t' &lt;&lt; num; // hier ist 'num' in [zeile,spalte] gültig
            }
            else
                break; // Lesefehler bzw. EOF
        }
        cout &lt;&lt; endl;
    }
    if( !File.eof() )
        cerr &lt;&lt; &quot;beim Lesen ist ein Fehler aufgetreten&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965784</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 14 Oct 2010 20:32:33 GMT</pubDate></item></channel></rss>