<?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 formatiert einlesen]]></title><description><![CDATA[<p>Hi,<br />
ich würde gern aus einer Datei<br />
Datei.txt<br />
a(2,2) = -1.835417e+06 [1/s]<br />
a(3,2) = 1.835417e+06 [1/s]<br />
die Zahlen auslesen.<br />
Versucht habe ich es mit 3 Schleifen durchläufe von</p>
<p>scan = fscanf(datei,&quot;a(%d,%d) = %e [1\\s] &quot;,&amp;(Zeile[i]),&amp;(Spalte[i]),&amp;(Wert[i]));</p>
<p>printf(&quot;a(%d,%d) = %e und scan: %d \n&quot;,Zeile[i],Spalte[i],Wert[i],scan);</p>
<p>Doch das Ergebnis war:</p>
<p>a(1,1) = -2.849212e-41 und scan: 3<br />
a(0,-1216006536) = 4.852668e-270 und scan: 0<br />
a(0,134513496) = -3.044647e-41 und scan: 0</p>
<p>Meine Fragen sind : Was muss ich korrigieren und wie hätte man es eleganter machen können. Ich würde mich sehr über eine Antwort freuen und nach google zu urteilen auch einige andere. Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260874/datei-formatiert-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 05:35:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260874.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Feb 2010 11:31:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei formatiert einlesen on Wed, 10 Feb 2010 11:31:15 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich würde gern aus einer Datei<br />
Datei.txt<br />
a(2,2) = -1.835417e+06 [1/s]<br />
a(3,2) = 1.835417e+06 [1/s]<br />
die Zahlen auslesen.<br />
Versucht habe ich es mit 3 Schleifen durchläufe von</p>
<p>scan = fscanf(datei,&quot;a(%d,%d) = %e [1\\s] &quot;,&amp;(Zeile[i]),&amp;(Spalte[i]),&amp;(Wert[i]));</p>
<p>printf(&quot;a(%d,%d) = %e und scan: %d \n&quot;,Zeile[i],Spalte[i],Wert[i],scan);</p>
<p>Doch das Ergebnis war:</p>
<p>a(1,1) = -2.849212e-41 und scan: 3<br />
a(0,-1216006536) = 4.852668e-270 und scan: 0<br />
a(0,134513496) = -3.044647e-41 und scan: 0</p>
<p>Meine Fragen sind : Was muss ich korrigieren und wie hätte man es eleganter machen können. Ich würde mich sehr über eine Antwort freuen und nach google zu urteilen auch einige andere. Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853523</guid><dc:creator><![CDATA[white flow]]></dc:creator><pubDate>Wed, 10 Feb 2010 11:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Wed, 10 Feb 2010 11:38:06 GMT]]></title><description><![CDATA[<p>1. ist es 1/s und nicht 1\\s, dein scan ist also falsch<br />
2. ist Wert vermutlich ein double-Array, du liest und schreibst hier aber floats.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853528</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Feb 2010 11:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Wed, 10 Feb 2010 12:28:48 GMT]]></title><description><![CDATA[<p>white flow schrieb:</p>
<blockquote>
<p>wie hätte man es eleganter machen können.</p>
</blockquote>
<p>Falls du hier nicht versehentlich im falschen Unterforum geschreieben hast (hier ist C++, nicht C): Mit C++ Mittel dürfte sich das, wenn auch nicht unbedingt eleganter, so doch auf jeden Fall allgemeiner machen lassen. Und das ist dann doch auch wieder eine Form von Eleganz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853560</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Feb 2010 12:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Wed, 10 Feb 2010 12:45:13 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Hilfe:</p>
<p>Mit</p>
<p>scan = fscanf(datei,&quot;a(%d,%d) = %lf [1/s] &quot;,&amp;(Zeile[i]),&amp;(Spalte[i]),&amp;(Wert[i]));</p>
<p>hat es funktioniert.</p>
<p>P.S. Falsches Forum ? Ich glaube nicht <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="😉"
    /> ihr konntet mir doch helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853575</guid><dc:creator><![CDATA[white flow]]></dc:creator><pubDate>Wed, 10 Feb 2010 12:45:13 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Wed, 10 Feb 2010 21:33:17 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>white flow schrieb:</p>
<blockquote>
<p>wie hätte man es eleganter machen können.</p>
</blockquote>
<p>Falls du hier nicht versehentlich im falschen Unterforum geschreieben hast (hier ist C++, nicht C): Mit C++ Mittel dürfte sich das, wenn auch nicht unbedingt eleganter, so doch auf jeden Fall allgemeiner machen lassen. Und das ist dann doch auch wieder eine Form von Eleganz.</p>
</blockquote>
<p>So etwa?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;streambuf&gt;

struct text
{
    text( const char* txt ) : m_txt( txt ) {}
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, const text&amp; t )
    {
        using namespace std;
        istream::sentry ok( in );
        if( ok )
        {
            ios_base::io_state state = ios_base::goodbit;
            const char* ref = t.m_txt;
            for( istream::int_type m = in.rdbuf()-&gt;sgetc(); *ref; ++ref, m = in.rdbuf()-&gt;snextc() )
            {
                typedef istream::traits_type traits;
                if( traits::eq_int_type( m, traits::eof() ) )
                {
                    state |= ios_base::eofbit | ios_base::failbit;
                    break;
                }
                if( traits::to_char_type( m ) != *ref )
                {
                    state |= ios_base::failbit;
                    break;
                }
            }
            in.setstate( state );
        }
        return in;
    }
private:
    const char* m_txt;
};

int main()
{
    using namespace std;
    ifstream datei(&quot;Datei.txt&quot;);
    int zeile, spalte;
    for( double wert; datei &gt;&gt; text(&quot;a(&quot;) &gt;&gt; zeile &gt;&gt; text(&quot;,&quot;) &gt;&gt; spalte &gt;&gt; text(&quot;) =&quot;) &gt;&gt; wert &gt;&gt; text(&quot;[1/s]&quot;); )
        cout &lt;&lt; &quot;a(&quot; &lt;&lt; zeile &lt;&lt; &quot;,&quot; &lt;&lt; spalte &lt;&lt; &quot;) = &quot; &lt;&lt; wert &lt;&lt; &quot; [1/s]&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853894</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 10 Feb 2010 21:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Fri, 12 Feb 2010 10:22:53 GMT]]></title><description><![CDATA[<p>Werner fielen Dank für dein wahrscheinlich<br />
sehr elegante Struktur, die im Moment noch meine Kenntnisse, der verwendeten<br />
Klassen überflügelt, doch einige Anregungen zum Vertiefen gibt.</p>
<p>Leider bin ich bin mit einem weitern etwas merkwürdigen C++ Problem konfrontiert.<br />
Die aus der Datei ausgelesen Daten werden durch die Funktion einlesen() wie gewollt zur Kontrolle ausgegeben, doch die main Funktion gibt nichts aus.<br />
Benutze ich aber den konkreten Pfad funktioniert es, was ich sehr merkwürdig finde.</p>
<p>Ist die Art und Weise wie ich in der main Funktion auf die Matrix zu greife, ok?</p>
<p>struct Matrix {<br />
int dim;<br />
double **Wert;<br />
};</p>
<p>Matrix* einlesen(void)<br />
{</p>
<p>int Zeile[400];<br />
int Spalte[400];<br />
double Datenwert[400];</p>
<p>char* Dateipfad;// = &quot;/konkreter Dateipfad&quot;;<br />
cout&lt;&lt;&quot;Geben Sie bitte den Dateipfad ein.&quot;&lt;&lt;endl;<br />
scanf(&quot;%s&quot;,Dateipfad);</p>
<p>FILE <em>datei;<br />
datei = fopen(Dateipfad/</em>&quot;/konkreter Dateipfad&quot;*/,&quot;r&quot;);</p>
<p>int i = 0;</p>
<p>while(fscanf(datei,&quot;a(%d,%d) = %lf [1/s] &quot;,&amp;(Zeile[i]),&amp;(Spalte[i]),&amp;(Datenwert[i])) != 0 ){</p>
<p>printf(&quot;a(%d,%d) = %e [1/s] \n&quot;,Zeile[i],Spalte[i],Datenwert[i]);<br />
i++;<br />
}</p>
<p>fclose(datei);</p>
<p>cout&lt;&lt;&quot;Es sind: &quot;&lt;&lt;i&lt;&lt;&quot; Datensaetze.&quot;&lt;&lt;endl;</p>
<p>int AnzahlDaten;<br />
AnzahlDaten = i;</p>
<p>double Zwischenspeicher;<br />
Zwischenspeicher = ((i - 4)/3) +2;</p>
<p>int Anz_Dia_Ele;<br />
Anz_Dia_Ele = (int)Zwischenspeicher;</p>
<p>cout &lt;&lt; &quot;Es sollen &quot;&lt;&lt; Anz_Dia_Ele &lt;&lt;&quot; Eigenwerte berechnet.&quot; &lt;&lt;endl;<br />
cout&lt;&lt;endl;</p>
<p>Matrix* DatenMatrix;<br />
DatenMatrix = new Matrix;<br />
DatenMatrix-&gt;dim = Anz_Dia_Ele;</p>
<p>DatenMatrix-&gt;Wert = new double*[Anz_Dia_Ele];</p>
<p>for(int i = 0;i&lt;Anz_Dia_Ele;i++){<br />
*(DatenMatrix-&gt;Wert + i) = new double[Anz_Dia_Ele];<br />
}</p>
<p>for(int t=0;t &lt; AnzahlDaten; t++)<br />
{<br />
<em>(</em>(DatenMatrix-&gt;Wert + (Zeile[t]-1))+(Spalte[t]-1))= Datenwert[t];<br />
}</p>
<p>return DatenMatrix;<br />
}</p>
<p>int main()<br />
{<br />
cout&lt;&lt;<em>(</em>(einlesen()-&gt;Wert+0)+0)&lt;&lt;<em>(</em>(einlesen()-&gt;Wert+1)+1)&lt;&lt;<em>(</em>(einlesen()-&gt;Wert+2)+2)&lt;&lt;endl;<br />
}</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854560</guid><dc:creator><![CDATA[white flow]]></dc:creator><pubDate>Fri, 12 Feb 2010 10:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Fri, 12 Feb 2010 10:31:39 GMT]]></title><description><![CDATA[<p>Nur mal eben in die richtigen Tags:</p>
<pre><code class="language-cpp">struct Matrix {
    int dim;
    double **Wert;
};

Matrix* einlesen(void)
{

	 int Zeile[400];
	 int Spalte[400];
     double Datenwert[400];

	 char* Dateipfad;// = &quot;/konkreter Dateipfad&quot;;
        cout&lt;&lt;&quot;Geben Sie bitte den Dateipfad ein.&quot;&lt;&lt;endl;
     scanf(&quot;%s&quot;,Dateipfad);

	 FILE *datei;
	 datei = fopen(Dateipfad/*&quot;/konkreter Dateipfad&quot;*/,&quot;r&quot;);

	 int i = 0;

	 while(fscanf(datei,&quot;a(%d,%d) = %lf [1/s] &quot;,&amp;(Zeile[i]),&amp;(Spalte[i]),&amp;(Datenwert[i])) != 0 ){

	  		 printf(&quot;a(%d,%d) = %e [1/s] \n&quot;,Zeile[i],Spalte[i],Datenwert[i]);
	  		 i++;
	  }

     fclose(datei);

     cout&lt;&lt;&quot;Es sind: &quot;&lt;&lt;i&lt;&lt;&quot; Datensaetze.&quot;&lt;&lt;endl;

     int AnzahlDaten;
     AnzahlDaten = i;

     double Zwischenspeicher;
     Zwischenspeicher = ((i - 4)/3) +2;

     int Anz_Dia_Ele;
     Anz_Dia_Ele = (int)Zwischenspeicher;

     cout &lt;&lt; &quot;Es sollen &quot;&lt;&lt; Anz_Dia_Ele &lt;&lt;&quot; Eigenwerte berechnet.&quot; &lt;&lt;endl;
     cout&lt;&lt;endl;

     Matrix* DatenMatrix;
     DatenMatrix = new Matrix;
     DatenMatrix-&gt;dim = Anz_Dia_Ele;

     DatenMatrix-&gt;Wert = new double*[Anz_Dia_Ele];

     for(int i = 0;i&lt;Anz_Dia_Ele;i++){
     *(DatenMatrix-&gt;Wert + i) = new double[Anz_Dia_Ele];
     }

     for(int t=0;t &lt; AnzahlDaten; t++)
          {
    	   *(*(DatenMatrix-&gt;Wert + (Zeile[t]-1))+(Spalte[t]-1))= Datenwert[t];
          }

     return DatenMatrix;
}

int main()
{
  cout&lt;&lt;*(*(einlesen()-&gt;Wert+0)+0)&lt;&lt;*(*(einlesen()-&gt;Wert+1)+1)&lt;&lt;*(*(einlesen()-&gt;Wert+2)+2)&lt;&lt;endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1854564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854564</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 12 Feb 2010 10:31:39 GMT</pubDate></item><item><title><![CDATA[Reply to Datei formatiert einlesen on Sat, 13 Feb 2010 10:33:45 GMT]]></title><description><![CDATA[<p>white flow schrieb:</p>
<blockquote>
<p>Die aus der Datei ausgelesen Daten werden durch die Funktion einlesen() wie gewollt zur Kontrolle ausgegeben, doch die main Funktion gibt nichts aus.<br />
Benutze ich aber den konkreten Pfad funktioniert es, was ich sehr merkwürdig finde.</p>
</blockquote>
<p>Das ist nicht merkwürdig, wenn man sich darüber Gedanken hat, wo die Zeichen aus dem String 'DateiPfad' überhaupt hingespeichert werden. Du hast dafür keinerlei Memory zur Verfügung gestellt.<br />
Da wir hier in der C++-Ecke sind - schlage ich Dir folgendes Vorgehen vor (ab Zeile 13 in Fellhuhns Posting):</p>
<pre><code class="language-cpp">// #include &lt;string&gt; // noch inkludieren
    string Dateipfad;// = &quot;/konkreter Dateipfad&quot;;
    cout&lt;&lt;&quot;Geben Sie bitte den Dateipfad ein.&quot;&lt;&lt;endl;
    getline( cin, Dateipfad );
</code></pre>
<p>Bitte inkludiere noch &lt;string&gt; damit es funktioniert. Die std::string-Klasse nimmt Dir das Besorgen des benötigten Speichers ab und viel einfacher zu benutzten, als wenn Du selbst mit new/alloc versuchst es zu organisieren.</p>
<p>white flow schrieb:</p>
<blockquote>
<p>Ist die Art und Weise wie ich in der main Funktion auf die Matrix zu greife, ok?</p>
</blockquote>
<p>Nicht so ganz. Jedes mal, wenn Du einlesen() aufrufst, wird es auch ausgeführt. D.h. Die Matrix wird im besten Fall auch dreimal gelesen, was ja völlig unnötig ist, außerdem wird für drei Matrizen Speicher allokiert, der auch nie wieder frei gegeben wird.</p>
<p>Besser Du änderst zunächst die Matrix so ab, dass Du Dich um den Speicher nicht mehr sorgen musst.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;cassert&gt;

struct Matrix
{
    explicit Matrix( std::size_t dim )
        : m_anzSpalten( dim )
        , m_werte( dim * dim )
    {}
    double* operator[]( std::size_t idxZeile )
    {
        assert( idxZeile &lt; m_werte.size() / m_anzSpalten );
        return &amp;m_werte[ idxZeile * m_anzSpalten ];
    }
private:
    std::size_t m_anzSpalten;
    std::vector&lt; double &gt; m_werte;
};
</code></pre>
<p>Der Zugriff auf ein Element funktioniert dann einfach mit</p>
<pre><code class="language-cpp">Matrix mx(20);
    mx[4][1] = 3.14; // Element mit Index Zeile 4 und Index Spalte 1 setzen
</code></pre>
<p>Der Code ab Zeile 44 vereinfacht sich dann zu:</p>
<pre><code class="language-cpp">Matrix DatenMatrix( Anz_Dia_Ele );
    for(int t=0;t &lt; AnzahlDaten; ++t )
    {
        assert( Zeile[t] &lt;= Anz_Dia_Ele ); // Indizes checken
        assert( Spalte[t] &lt;= Anz_Dia_Ele );
        DatenMatrix[ Zeile[t]-1 ][ Spalte[t]-1 ] = Datenwert[t];
    }

    return DatenMatrix;
</code></pre>
<p>Die Signatur von einlesen muss dann noch angepasst werden</p>
<pre><code class="language-cpp">Matrix einlesen()
{ // usw.
</code></pre>
<p>und schließlich wird das main() zu:</p>
<pre><code class="language-cpp">int main()
{
    using namespace std;
    Matrix mx = einlesen();
    cout &lt;&lt; mx[0][0] &lt;&lt; &quot; &quot; &lt;&lt; mx[1][1] &lt;&lt; &quot; &quot; &lt;&lt; mx[2][2] &lt;&lt; endl;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854972</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 13 Feb 2010 10:33:45 GMT</pubDate></item></channel></rss>