<?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[string-variablen aus Textdatei lesen und in integer-Feld schreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem:<br />
Ich möchte aus einer Textdatei Werte auslesen und in ein Array vom Typ integer überführen. Dabei ändert sich die Anzahl der Variablen mit der ebenfalls dort eingegebenen Variable Anz_Var. Die Datei sieht ungefähr so aus:</p>
<p>**Anzahl Variablen: 3</p>
<p>Var_nr;uGrenze;oGrenze<br />
1;5;50<br />
2;44;450<br />
3;50;100**</p>
<p>Ich habe schon mit ifstream die Zeilen einlesen können. Komme aber dann nicht weiter.</p>
<p>Wie komme ich an die &quot;3&quot; und wandele den String dann in einen Integerwert? Diesen Wert weise ich dann einer Variable Anz_Var zu.</p>
<p>Dann ein 3D-Feld int array[Anz_Var] erstellen.<br />
Wie kann ich das Feld mit den Werten füllen? (Die Zahlen 1, 5, 50 der ersten zeile und der anderen Zeilen sind immer durch ein Semikolon (bzw. einen Tab-Stopp) getrennt.)</p>
<p>Vielen Dank für eure Mühe.</p>
<p>Grüße</p>
<p>Guddy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218581/string-variablen-aus-textdatei-lesen-und-in-integer-feld-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 13:59:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218581.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Jul 2008 15:52:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Tue, 22 Jul 2008 15:52:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem:<br />
Ich möchte aus einer Textdatei Werte auslesen und in ein Array vom Typ integer überführen. Dabei ändert sich die Anzahl der Variablen mit der ebenfalls dort eingegebenen Variable Anz_Var. Die Datei sieht ungefähr so aus:</p>
<p>**Anzahl Variablen: 3</p>
<p>Var_nr;uGrenze;oGrenze<br />
1;5;50<br />
2;44;450<br />
3;50;100**</p>
<p>Ich habe schon mit ifstream die Zeilen einlesen können. Komme aber dann nicht weiter.</p>
<p>Wie komme ich an die &quot;3&quot; und wandele den String dann in einen Integerwert? Diesen Wert weise ich dann einer Variable Anz_Var zu.</p>
<p>Dann ein 3D-Feld int array[Anz_Var] erstellen.<br />
Wie kann ich das Feld mit den Werten füllen? (Die Zahlen 1, 5, 50 der ersten zeile und der anderen Zeilen sind immer durch ein Semikolon (bzw. einen Tab-Stopp) getrennt.)</p>
<p>Vielen Dank für eure Mühe.</p>
<p>Grüße</p>
<p>Guddy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551791</guid><dc:creator><![CDATA[guddy]]></dc:creator><pubDate>Tue, 22 Jul 2008 15:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Tue, 22 Jul 2008 16:48:10 GMT]]></title><description><![CDATA[<p>Hallo Guddy,</p>
<p>anbei mein Vorschlag:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;limits&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;
}

struct Foo
{
    int m_var, m_uGrenze, m_oGrenze;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x )
{
    return in &gt;&gt; x.m_var &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_uGrenze &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_oGrenze;
}

std::istream&amp; read3DArray( std::istream&amp; in, std::vector&lt; Foo &gt;&amp; dreiD_ )
{
    in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' );
    std::size_t anzahl;
    char dummy; // das Lesen des 'dummy' garantiert, das sich der Lesezeiger in der Kommenatrzeile befindet
    if( (in &gt;&gt; anzahl &gt;&gt; dummy)
            .ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) ) // Kommentar überlesen
    {
        std::vector&lt; Foo &gt; dreiD;
        dreiD.reserve( anzahl );    // optional
        for( Foo x; anzahl &amp;&amp; in &gt;&gt; x; --anzahl )
            dreiD.push_back( x );
        if( in )
            swap( dreiD, dreiD_ );  // ok; dann übernehmen
    }
    return in;
}

int main()
{
    using namespace std;
    vector&lt; Foo &gt; dreiD;
    ifstream file( &quot;C:/tmp/input.txt&quot; );
    if( !file.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen&quot; &lt;&lt; endl;
        return -1;
    }
    if( read3DArray( file, dreiD ) )
    {
        cout &lt;&lt; &quot;alles klar!&quot; &lt;&lt; endl;
    }
};
</code></pre>
<p>(getestet und funktioniert)</p>
<p>frag' nach, wenn Du was nicht verstehst.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551835</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 22 Jul 2008 16:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Tue, 22 Jul 2008 20:38:24 GMT]]></title><description><![CDATA[<p>Hallo Werner,</p>
<p>viel verstehe ich leider nicht.</p>
<p>hier erzeugst du eine Funktionsvorlage, aber warum?</p>
<pre><code>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;
}
</code></pre>
<p>Ist struct eine Ansammlung von Werten verschiedener Datentypen, in dem Fall halt mal gleich? Wozu brauch ich das?</p>
<pre><code>struct Foo	
{
int m_var, m_uGrenze, m_oGrenze;
};
</code></pre>
<p>Was passiert hier? Liest das Programm das Objekt x ein? Was bedeutet das &amp;?:</p>
<pre><code>std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x ) 
{
    return in &gt;&gt; x.m_var &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_uGrenze &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_oGrenze;
}
</code></pre>
<p>Den folgenden Abschnitt versteh ich leider auch nicht...Kannst du das noch etwas beschreiben?</p>
<pre><code>std::istream&amp; read3DArray( std::istream&amp; in, std::vector&lt; Foo &gt;&amp; dreiD_ )
{
    in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' );
    std::size_t anzahl;
    char dummy; // das Lesen des 'dummy' garantiert, das sich der Lesezeiger in der Kommenatrzeile befindet
    if( (in &gt;&gt; anzahl &gt;&gt; dummy)
            .ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) ) // Kommentar überlesen
    {
        std::vector&lt; Foo &gt; dreiD;
        dreiD.reserve( anzahl );    // optional
        for( Foo x; anzahl &amp;&amp; in &gt;&gt; x; --anzahl )
            dreiD.push_back( x );
        if( in )
            swap( dreiD, dreiD_ );  // ok; dann übernehmen
    }
    return in;
}
</code></pre>
<p>Danke für deine Mühe, ich hab leider bis jetzt nur mit statischen Feldern gearbeitet...</p>
<p>Grüße</p>
<p>Guddy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551987</guid><dc:creator><![CDATA[guddy]]></dc:creator><pubDate>Tue, 22 Jul 2008 20:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Tue, 22 Jul 2008 21:52:32 GMT]]></title><description><![CDATA[<p>Wiedermal wunderschön Werner. Ist man bei dir ja auch inzwischen nicht anders gewöhnt, wenns vorallem um Streams geht <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>Insbesondere die Idee mit dem Char&lt;';'&gt; gefällt mir außerordentlich gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
[Code in Lesezeichen save]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552015</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 Jul 2008 21:52:32 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 08:52:22 GMT]]></title><description><![CDATA[<p>Wozu ist das &quot;Char&lt;';'&gt;&quot; gut? Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552210</guid><dc:creator><![CDATA[stanmc]]></dc:creator><pubDate>Wed, 23 Jul 2008 08:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 13:24:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab mir das ganze nochmal reingezogen und einiges verstanden, denk ich. Ich hab mal Kommentare in den Quelltext geschrieben. Vielleicht könnt ihr mir Feedback geben ob ich das richtig vestehe oder nicht.</p>
<p>t</p>
<pre><code>emplate&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;
}

struct Foo
{
    int m_var, m_uGrenze, m_oGrenze;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x ) //formatierter input (was bedeuten die Werte in den Klammern? in=Name des iputstream?? und Ausgabe in x??
{
    return in &gt;&gt; x.m_var &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_uGrenze &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_oGrenze; //gibt Werte des inputstream in zurück aber ohne &quot;;&quot;? und zwar in die Variablen der Strucktur x?
}

std::istream&amp; read3DArray( std::istream&amp; in, std::vector&lt; Foo &gt;&amp; dreiD_ ) //Definier von istream abgeleitete Funktion read3DArray mit inputstreamquelle  in und Ziel vector dreiD_ mit daten-bzw. structurtyp Foo 
{
    in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' ); // ignore(streamlänge, Zeichen) ignoriert Strom bis zu dem Punkt, wenn Streamlänge erreicht oder Zeichen gefunden
    std::size_t anzahl; //size_t übergibt Wert oder stringlänge von Anz_Var an Variable anzahl???
    char dummy; // das Lesen des 'dummy' garantiert, das sich der Lesezeiger in der Kommenatrzeile befindet 
    if( (in &gt;&gt; anzahl &gt;&gt; dummy)
            .ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) ) // Kommentar überlesen
    {
        std::vector&lt; Foo &gt; dreiD; //erzeugt Vektor mit datentyp/Structur Foo mit namen dreiD?
        dreiD.reserve( anzahl );    // optional, reserviert ein Minimum an Speicher von anzahl für den Vector dreiD 
        for( Foo x; anzahl &amp;&amp; in &gt;&gt; x; --anzahl ) //Führe aus (Structur x; ?????; Zähle anzahl runter 
            dreiD.push_back( x );//fülle Vektor dreiD mit x vom Structurtyp foo
        if( in ) // wenn in != o dann 
            swap( dreiD, dreiD_ );  // ok; dann übernehmen,   swap tauscht Werte von Object dreiD zu dreiD_ , Warum?????
    }
    return in; gib in zurück, warum???
}

int main()
{
    using namespace std;
    vector&lt; Foo &gt; dreiD;
    ifstream file( &quot;/smb_mnt/tgutjahr/p/groupdrives/oe624-lsk/Aktuell/dipl/08-gutjahr/programme/Optimierungsprogramm/Testprogramme/test.txt&quot; );
    if( !file.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen&quot; &lt;&lt; endl;
        return -1;
    }
    if( read3DArray( file, dreiD ) )
    {
        cout &lt;&lt; &quot;alles klar!&quot; &lt;&lt; endl;
    }
};
</code></pre>
<p>Was bedeutet das &quot;&amp;&quot; in Zeilen wie dieser?</p>
<pre><code>std::istream&amp; Char( std::istream&amp; in )
</code></pre>
<p>Ist das eine Referenz? Welchen Sinn hat das?</p>
<p>Viele Grüße</p>
<p>Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552411</guid><dc:creator><![CDATA[guddy]]></dc:creator><pubDate>Wed, 23 Jul 2008 13:24:31 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 15:33:33 GMT]]></title><description><![CDATA[<p>warum nimmst du keine cpp-tags? das wär vll für c++-quelltext gar ne so doof ^^</p>
<p>ja, ist ne referenz...</p>
<pre><code class="language-cpp">std::istream&amp; Char( std::istream&amp; in )
</code></pre>
<p>hier wird immer nur eine Referenz kopiert... (ist so was wie ein Pointer)</p>
<pre><code class="language-cpp">std::istream Char( std::istream in )
</code></pre>
<p>So geht es zwar auch, aber jedes mal wird der istream (unnötig) kopiert...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552512</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 23 Jul 2008 15:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 16:02:58 GMT]]></title><description><![CDATA[<p>Streams können nicht kopiert werden <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/1552529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552529</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 23 Jul 2008 16:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 16:07:15 GMT]]></title><description><![CDATA[<p>stanmc schrieb:</p>
<blockquote>
<p>Wozu ist das &quot;Char&lt;';'&gt;&quot; gut? Danke.</p>
</blockquote>
<p>Das dient ausschließlich dazu, ein Semikolon einzulesen und - falls da kein Semikolon kommt - den Stream in den Fehlerstatus zu setzen.<br />
Also wenn man z.B.: schreibt</p>
<pre><code class="language-cpp">int i1, i2;
    if( cin &gt;&gt; i1 &gt;&gt; Char&lt;';'&gt; &gt;&gt; i2 )
    {
        // i1 und i2 wurden gelesen
        // und es stand mit Sicherheit ein Semikolon dazwischen
</code></pre>
<p>dann kann man im Gutfall sicher sein, dass das Format im Stream so ist, wie es spezifiziert wurde.</p>
<p>Siehe dazu auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-190246-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-trenner-and-start-is-11.html" rel="nofollow">hier mit 'trenner'</a> oder <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-212518-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-sep+september-and-start-is-19.html" rel="nofollow">hier mit 'sep'</a>.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552534</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 23 Jul 2008 16:07:15 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 16:46:35 GMT]]></title><description><![CDATA[<p>guddy schrieb:</p>
<blockquote>
<p>hab mir das ganze nochmal reingezogen und einiges verstanden, denk ich. Ich hab mal Kommentare in den Quelltext geschrieben. Vielleicht könnt ihr mir Feedback geben ob ich das richtig vestehe oder nicht. ...</p>
</blockquote>
<p>Hallo Torsten,</p>
<p>aus Deinen Fragen schließe ich, dass ich bei Dir ziemlich weit vorn anfangen muss. Ich werde das hier nur kurz beantworten. Vielleicht schlägst Du die Themen nochmal zusätzlich in der Dir verfügbaren Literatur nach.</p>
<p>guddy schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct Foo
{
    int m_var, m_uGrenze, m_oGrenze;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x ) //formatierter input (was bedeuten die Werte in den Klammern? in=Name des iputstream?? und Ausgabe in x??
{
    return in &gt;&gt; x.m_var &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_uGrenze &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_oGrenze; //gibt Werte des inputstream in zurück aber ohne &quot;;&quot;? und zwar in die Variablen der Strucktur x?
}
</code></pre>
</blockquote>
<p>In C++ ist ein Ausdruck wie</p>
<pre><code class="language-cpp">a = b + c;
</code></pre>
<p>eine Funktion. Das ist ein Funktion mit zwei Parametern, was man auch so schreiben könnte:</p>
<pre><code class="language-cpp">a = operator+( int a, int b );
</code></pre>
<p>D.h. die Funktion heißt 'operator+' und hat die beiden Parameter 'a' und 'b' und das Ergebnis - also den Returnwert der Funktion - weise ich hier 'c' zu.</p>
<p>Das kann man für fast alle Operatoren machen. Z.B. für den operator&gt;&gt;. Also statt zu schreiben</p>
<pre><code class="language-cpp">std::istream&amp; lese_Foo_ein( std::istream&amp; in, Foo&amp; x )
</code></pre>
<p>schreibt man</p>
<pre><code class="language-cpp">std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x )
</code></pre>
<p>. Das Ziel ist es nachher beim Aufruf einfach</p>
<pre><code class="language-cpp">Foo x;
    cin &gt;&gt; x;
</code></pre>
<p>zu schreiben. Genauso wie man a+b und nicht addiere( a, b ) schreiben möchte.</p>
<p>Durch die Rückgabe der Referenz auf den Stream - und das muss(!) der selbe Stream sein wie der der übergeben wurde - erreicht man, dass man die Eingaben hintereinander schreiben kann. Etwa so</p>
<pre><code class="language-cpp">Foo x, y, z;
    cin &gt;&gt; x &gt;&gt; y &gt;&gt; z;
</code></pre>
<p>guddy schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::istream&amp; read3DArray( std::istream&amp; in, std::vector&lt; Foo &gt;&amp; dreiD_ ) //Definier von istream abgeleitete Funktion read3DArray mit inputstreamquelle  in und Ziel vector dreiD_ mit daten-bzw. structurtyp Foo 
{
    in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' ); // ignore(streamlänge, Zeichen) ignoriert Strom bis zu dem Punkt, wenn Streamlänge erreicht oder Zeichen gefunden
    std::size_t anzahl; //size_t übergibt Wert oder stringlänge von Anz_Var an Variable anzahl???
    char dummy; // das Lesen des 'dummy' garantiert, das sich der Lesezeiger in der Kommenatrzeile befindet 
    if( (in &gt;&gt; anzahl &gt;&gt; dummy)
            .ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) ) // Kommentar überlesen
    {
        std::vector&lt; Foo &gt; dreiD; //erzeugt Vektor mit datentyp/Structur Foo mit namen dreiD?
        dreiD.reserve( anzahl );    // optional, reserviert ein Minimum an Speicher von anzahl für den Vector dreiD 
        for( Foo x; anzahl &amp;&amp; in &gt;&gt; x; --anzahl ) //Führe aus (Structur x; ?????; Zähle anzahl runter 
            dreiD.push_back( x );//fülle Vektor dreiD mit x vom Structurtyp foo
        if( in ) // wenn in != o dann 
            swap( dreiD, dreiD_ );  // ok; dann übernehmen,   swap tauscht Werte von Object dreiD zu dreiD_ , Warum?????
    }
    return in; gib in zurück, warum???
}
</code></pre>
</blockquote>
<p>Eine Funktion kann man nicht ableiten. Das gilt nur für Klassen bzw. Strukturen. readArray ist einfach eine Funktion mit zwei Parametern. Beide Parameter werden als - nicht const - Referenz übergeben; d.h. man kann die Werte ändern, die außerhalb der Funktion deklariert werden.</p>
<p>Die Funktion von ignore hast Du richtig verstanden -es wird bis zum Doppelpunkt inklusive alles überlesen.</p>
<p>size_t ist ein Typ wie int. Ich hätte auch 'int anzahl;' schreiben können. Nur der Standard gibt vor die Anzahl der Elemente in einem Container als std::size_t zu deklarieren. Denke einfach es wäre ein int, dann passt das.</p>
<p>dreiD und reserve passt.</p>
<p>Du kennst sicher for-Schleifen in der Art</p>
<pre><code class="language-cpp">for( int i = 0; i &lt; 5; ++i )
</code></pre>
<p>Genauso wie dort ein int namens 'i' angelegt wird, habe ich bei mir ein Foo namens 'x' angelegt - ist genau das selbe.</p>
<p>Im mittleren Teil steht eine Bedingung, also ein Ausdruck der in ein bool konvertiert werden kann. Einmal ist es 'i &lt; 5' d.h. die Schleife wird solange durchlaufen solange i kleiner als 5 ist - in meinem Fall ist es eine UND-Bedingung d.h. beide Ausdrücke rechts und links von '&amp;&amp;' müssen 'true' sein, damit die Schleife durchlaufen wird.</p>
<p>Links steht 'anzahl' - das ist true solange anzahl ungleich 0 ist. Und rechts steht in &gt;&gt; x. Das ist das Einlesen eines Foo-Objekts namens 'x' vom Input 'in'. Wie schon oben beschrieben gibt das eine std::istream&amp; zurück. Diese Referenz ist in bool konvertierbar und liefert ein 'true' zurück, solange der Stream keinen Lesefehler hat.<br />
Wichtig ist noch - der zweite also rechte Ausdruck eines '&amp;&amp;' wird nur genau dann ausgeführt, wenn der erste bereits 'true' ist. D.h. wenn die 'anzahl' bei 0 ankommt, wird auch kein x mehr vom stream gelesen. Das ist wichtig, weil im Stream keines mehr kommt und man vielleicht danach noch etwas anderes aus dem Stream lesen möchte.</p>
<p>Das swap hat den Zweck die gelesenen Daten in 'dreiD' nach 'dreiD_' zu schaufeln, denn das ist ja der Parameter, der per Referenz übergeben wurde und der soll ja geändert bzw. gefüllt werden.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552550</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 23 Jul 2008 16:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Wed, 23 Jul 2008 18:21:12 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Insbesondere die Idee mit dem Char&lt;';'&gt; gefällt mir außerordentlich gut</p>
</blockquote>
<p>Mir nicht. Damit kannst du nicht mal den Nutzer die Möglichkeit anbieten, dass der Separator optional gewählt werden kann, weil eine Änderung bei Templates nur mit neukompileren möglich ist. Eine einfache Funktion mit Parameter wäre da komfortabler und flexibler. Außerdem sollte man den gleichen Separator auch nicht X mal im Code verteilen, sondern als Konstante halten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18974">@guddy</a><br />
Hier mal ein Lösungsansatz der deinem Niveau entspricht.</p>
<pre><code class="language-cpp">int main()
{
	std::ifstream file( &quot;C:/tmp/input.txt&quot; );
    if( !file.is_open() )
    {
        std::cerr &lt;&lt; &quot;Fehler beim Oeffnen&quot; &lt;&lt; std::endl;
        return -1;
    }
    file.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' );
	size_t arraySize;
	file &gt;&gt; arraySize;

	std::string comment;
	file &gt;&gt; comment; //geht hier so einfach, da Var_nr;uGrenze;oGrenze ein Wort ist

	int varNr, uGrenze;
	char separator;
	//Hier noch ein array erstellen und ne Schleife rum
	file &gt;&gt; varNr &gt;&gt; separator &gt;&gt; uGrenze; // usw...
};
</code></pre>
<p>Fehlerprüfung kannst/musst du auch noch einbauen und wenn du willst noch ein paar structs und Funktionen zur Übersichlichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552594</guid><dc:creator><![CDATA[mal einfach]]></dc:creator><pubDate>Wed, 23 Jul 2008 18:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Fri, 25 Jul 2008 12:46:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab mal &quot;mal einfach&quot;s Variante probiert, weil sie mir einfacher erscheint.<br />
Ich hab deine Anweisungen befolgt, aber der compiler spuckt einige folgender Fehlermeldungen aus:</p>
<pre><code>C:29: error: no match for 'operator&gt;&gt;' in 'file.std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::&lt;anonymous&gt;.std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt; [with _CharT = char, _Traits = std::char_traits&lt;char&gt;](((int&amp;)(&amp; varNr))) &gt;&gt; separator'
</code></pre>
<p>Kann es sein, dass die datentypen nicht übereinstimmen? im stream stehen ja eigentlich string oder char. Ich habe aber oGrenze, usw. als int definiert. Wenn ich sie jedoch als char definiere kommen ähnliche fehler...<br />
Wo leigt der Fehler?</p>
<p>Der Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

int main()
{

    std::ifstream file(&quot;Variableninput.dat&quot;);
    if( !file.is_open() )
    {
        std::cerr &lt;&lt; &quot;Fehler beim Oeffnen&quot; &lt;&lt; std::endl;
        return -1;
    }
    file.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' );
    size_t arrayHeigth;
    file &gt;&gt; arrayHeigth;

    std::string comment;
    file &gt;&gt; comment; //geht hier so einfach, da Var_nr;uGrenze;oGrenze ein Wort ist, ansonsten: file.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) )

    int varNr, uGrenze, oGrenze, arrayWidth;
    const char* separator = &quot;;&quot;;
    //Hier noch ein array erstellen und ne Schleife rum
    int varArray[arrayHeigth] [arrayWidth];
    arrayWidth = 3;

    for (unsigned int i = 1; i &lt;= arrayHeigth; i++)
    {	    
    file &gt;&gt; varNr &gt;&gt; separator &gt;&gt; uGrenze &gt;&gt; separator &gt;&gt; oGrenze &gt;&gt; &quot;\n&quot;;
    varArray [i] [1] = varNr; varArray [i] [2] = uGrenze; varArray [i] [3] = oGrenze;
    std :: cout &lt;&lt; varArray [i] [1] &lt;&lt; &quot;\t&quot; &lt;&lt; varArray [i] [2] &lt;&lt; &quot;\t&quot; &lt;&lt; varArray [i] [3]&lt;&lt; &quot;\n&quot;;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1553582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553582</guid><dc:creator><![CDATA[guddy]]></dc:creator><pubDate>Fri, 25 Jul 2008 12:46:57 GMT</pubDate></item><item><title><![CDATA[Reply to string-variablen aus Textdatei lesen und in integer-Feld schreiben on Mon, 04 Aug 2008 13:30:30 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich hab mal Werners Code probiert und ihn auch einigermaßen verstanden. Ich möchte nun noch ein paar Änderungen vornehmen. Die Inputdatei sieht jetzt wie folgt aus:</p>
<pre><code>Prozessname: Rankine
Datum oder Zifferncodierung: 66
GA-Typ: 1
Genome-Typ: 2
Testfunktionstyp: 1 
Anzahl der Durchläufe: 100 
Anzahl der Variablen:3

Var_nr;uGrenze;oGrenze
1;5;50
2;44;450
3;55;500
</code></pre>
<p>In der alten Datei wurden nur die Anzahl der Variablen eingelesen.</p>
<p>Wie kann ich Werners Code abändern um die Werte nach &quot;:&quot; als char (bei Prozessname, Datum oder Ziffern) und als int (bei GA-Typ, testfunktion und Anzahl der durchläufe) abzuspeichern?</p>
<p>Hier nochmal der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;limits&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;
}

struct Foo
{
    int m_var, m_uGrenze, m_oGrenze;

};

std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; x ) //formatierter input (was bedeuten die Werte in den Klammern? in=Name des iputstream?? und Ausgabe in x??
{
    return in &gt;&gt; x.m_var &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_uGrenze &gt;&gt; Char&lt;';'&gt; &gt;&gt; x.m_oGrenze; //gibt Werte des inputstream in zurück aber ohne &quot;;&quot;? und zwar in die Variablen der Strucktur x?
}

std::istream&amp; read3DArray( std::istream&amp; in, std::vector&lt; Foo &gt;&amp; dreiD_ ) //Definier von istream abgeleitete Funktion read3DArray mit inputstreamquelle  in und Ziel vector dreiD_ mit daten-bzw. structurtyp Foo 
{

    in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ':' ); // ignore(streamlänge, Zeichen) ignoriert Strom bis zu dem Punkt, wenn Streamlänge erreicht oder Zeichen gefunden

    std::size_t anzahl; //size_t übergibt Wert oder stringlänge von Anz_Var an Variable anzahl???
    char dummy; // das Lesen des 'dummy' garantiert, das sich der Lesezeiger in der Kommenatrzeile befindet 
    if( (in &gt;&gt; anzahl &gt;&gt; dummy)
            .ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ) ) // Kommentar überlesen
    {
        std::vector&lt; Foo &gt; dreiD; //erzeugt Vektor mit datentyp/Structur Foo mit namen dreiD?
        dreiD.reserve( anzahl );    // optional, reserviert ein Minimum an Speicher von anzahl für den Vector dreiD 
        for( Foo x; anzahl &amp;&amp; in &gt;&gt; x; --anzahl ) //Führe aus (Structur x; ?????; Zähle anzahl runter 
            dreiD.push_back( x );//fülle Vektor dreiD mit x vom Structurtyp foo
        if( in ) // wenn in != o dann 
            swap( dreiD, dreiD_ );  // ok; dann übernehmen,   swap tauscht Werte von Object dreiD zu dreiD_ , Warum?????
    }
    return in; //gib in zurück, warum???
}

int main()
{
    using namespace std;
    vector&lt; Foo &gt; dreiD;
    char prozessname[256]; 	
    ifstream file( &quot;Variableninput.dat&quot; );
    if( !file.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei Variableninput&quot; &lt;&lt; endl;
        return -1;
    }
    if( read3DArray( file, dreiD, prozessname) )
    {
        cout &lt;&lt; &quot;Vector eingelesen&quot; &lt;&lt; endl;
	cout &lt;&lt; dreiD[1].m_var &lt;&lt; endl;;
    }
}
</code></pre>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559048</guid><dc:creator><![CDATA[guddy]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:30:30 GMT</pubDate></item></channel></rss>