<?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[Fortran Zahlenformat mit C++ einlesen?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich muss eine ASCII-Datei auslesen. In dieser Datei stehen Zeilen wie diese:</p>
<pre><code>GRID     21864          -.4604962.-10   -1.55256
</code></pre>
<p>Dabei ist GRID ein Schlüsselwort, 21864 eine ID und der letzte Zahlenblock sind 3 Koordinaten. Die Datei basiert glaube ich noch auf Fortran. Jede Koordinate hat 8Stellen. (mit Dezimalpunkt und Vorzeichen usw.) Ich habe bis jetzt die Zeilen mit</p>
<pre><code class="language-cpp">sscanf(str.c_str(),&quot;%4s %d %8f %8f %8f&quot;,&amp;str4,&amp;ID,&amp;x1,&amp;x2,&amp;x3);
</code></pre>
<p>ausgelesen. Nun steht in der Zeile oben aber 2.-10 was 2e-10 darstellen soll. Mein Code liest hier aber 2.0 und -10 ein. Kann man ja auch fast nachvollziehen. Gibt es eine Möglichkeit dies richtig einzulesen? Ich habe schon lange gesucht und nichts gefunden. Bei printf kann man ja die minimale und maximale Anzahl an zu schreibenden Daten angeben, bei sscanf aber nur die maximale wenn ich richtig gelesen habe. Ich wäre über eure Hilfe sehr dankbar.</p>
<p>LG Gebb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303445/fortran-zahlenformat-mit-c-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 11:53:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303445.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2012 06:58:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Mon, 14 May 2012 06:58:19 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich muss eine ASCII-Datei auslesen. In dieser Datei stehen Zeilen wie diese:</p>
<pre><code>GRID     21864          -.4604962.-10   -1.55256
</code></pre>
<p>Dabei ist GRID ein Schlüsselwort, 21864 eine ID und der letzte Zahlenblock sind 3 Koordinaten. Die Datei basiert glaube ich noch auf Fortran. Jede Koordinate hat 8Stellen. (mit Dezimalpunkt und Vorzeichen usw.) Ich habe bis jetzt die Zeilen mit</p>
<pre><code class="language-cpp">sscanf(str.c_str(),&quot;%4s %d %8f %8f %8f&quot;,&amp;str4,&amp;ID,&amp;x1,&amp;x2,&amp;x3);
</code></pre>
<p>ausgelesen. Nun steht in der Zeile oben aber 2.-10 was 2e-10 darstellen soll. Mein Code liest hier aber 2.0 und -10 ein. Kann man ja auch fast nachvollziehen. Gibt es eine Möglichkeit dies richtig einzulesen? Ich habe schon lange gesucht und nichts gefunden. Bei printf kann man ja die minimale und maximale Anzahl an zu schreibenden Daten angeben, bei sscanf aber nur die maximale wenn ich richtig gelesen habe. Ich wäre über eure Hilfe sehr dankbar.</p>
<p>LG Gebb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211247</guid><dc:creator><![CDATA[Gebb]]></dc:creator><pubDate>Mon, 14 May 2012 06:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Mon, 14 May 2012 07:21:05 GMT]]></title><description><![CDATA[<p>Erstmal solltest du C++-Streams lernen. Dazu solltest du lernen, lieber die ganze Datei neu zu schreiben, denn ich kann da keine &quot;Drei&quot; Koordinaten erkennen...</p>
<pre><code class="language-cpp">std::ifstream stream(&quot;DataName.txt&quot;);

stream &gt;&gt; stdstring &gt;&gt; intID &gt;&gt; vector3D;
</code></pre>
<p>Wobei du vllt. eine Klasse vector3D erstellst (für Koordinaten), oder gleich eine Klasse für eine Entity definierst (mit Codename, ID, vector3D).<br />
Und schreib besser die ganze Datei nochmal neu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211254</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 May 2012 07:21:05 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Mon, 14 May 2012 07:35:42 GMT]]></title><description><![CDATA[<p>Ich nutze schon die Streams nur konnte ich sie für meine Zwecke nicht so nutzen wie ich es gerne hätte.<br />
Um die Datei neu zu schreiben müsste ich sie auch erst einmal adäquat auslesen können, denn die Datei wird mir so von einer (kommerziellen) Software ausgegeben, d.h. ich habe keine Möglichkeitkeit diese Formatierung zu ändern.<br />
Die Koordinaten in diesem Beispiel wären</p>
<pre><code>-.460496(-0.46049699), 2.-10 (2e-10) und -1.55256
</code></pre>
<p>. Wie bereits erwähnt sind dies 3 Felder der Größe 8. Das Problem, dass man bei vollen Feldern kein Leerzeichen hat habe ich mit der maximalen Stellenanzahl beim Einlesen in den Griff gekriegt. Jedoch habe ich keine Ahnung wie ich die 2.-10 einlesen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211258</guid><dc:creator><![CDATA[Gebb]]></dc:creator><pubDate>Mon, 14 May 2012 07:35:42 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Mon, 14 May 2012 08:02:55 GMT]]></title><description><![CDATA[<p>Wenn du die Datei nicht neu schreiben lassen kannst, würde ich evtl. eine eigene Klasse mit eingenem Einlese-Operator schreiben, etwa wie folgt:</p>
<pre><code class="language-cpp">class FortranDouble
{
  double d;
public: 
  operator double() { return d; }

  friend istream&amp; operator&gt;&gt;(istream&amp; is, FortranDouble&amp; fd)
  {
    // 8 Zeichen einlesen, parsen
    return is;
  }
};

int main()
{
  string grid;
  int id;
  std::array&lt;double, 3&gt; ds;

  ifstream if(&quot;dieDatei&quot;);
  if &gt;&gt; grid;
  if &gt;&gt; id;
  for (unsigned i = 0; i &lt; 3; ++i)
  {
    FortranDouble fd;
    if &gt;&gt; fd;
    ds[i] = fd;
  }
}
</code></pre>
<p>Hingeschludert, ungetestet, nur um ne Idee zu geben, wie es laufen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211274</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 May 2012 08:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Tue, 15 May 2012 06:08:41 GMT]]></title><description><![CDATA[<p>ja danke, habe ich auch gemacht. Dies sieht dann so aus</p>
<pre><code class="language-cpp">istringstream istr;
		istringstream istr1;
		istringstream istr2;
		istringstream istr3;

		getline(input2,str);
		str3=str;
		string coord1;
		string coord2;
		string coord3;

		str.erase(0,24);
		for (int i=0;i&lt;8;i++)
			coord1.append(1,str[i]);

		str.erase(0,8);

		for (int i=0;i&lt;8;i++)
			coord2.append(1,str[i]);

		str.erase(0,8);

		for (int i=0;i&lt;str.size();i++)
			coord3.append(1,str[i]);

		size_t found1=coord1.find_first_of(&quot;-&quot;,0);
		if(found1==0)
		{
			found1=coord1.find_first_of(&quot;-&quot;,1);

			if(found1==string::npos)
				;
			else
				coord1.insert(found1,&quot;e&quot;);

		}
		else if(found1&gt;0)
		{
			if(found1==string::npos)
				;
			else
				coord1.insert(found1,&quot;e&quot;);
		}

		size_t found2=coord2.find_first_of(&quot;-&quot;,0);

		if(found2==0)
		{
			found2=coord2.find_first_of(&quot;-&quot;,1);

			if(found2==string::npos)
				;
			else
				coord2.insert(found2,&quot;e&quot;);

		}
		else if(found2&gt;0)
		{
			if(found2==string::npos)
				;
			else
				coord2.insert(found2,&quot;e&quot;);
		}

		size_t found3=coord3.find_first_of(&quot;-&quot;,0);

		if(found3==0)
		{
			found3=coord3.find_first_of(&quot;-&quot;,1);

			if(found3==string::npos)
				;
			else
				coord3.insert(found3,&quot;e&quot;);

		}
		else if(found3&gt;0)
		{
			if(found3==string::npos)
				;
			else
				coord3.insert(found3,&quot;e&quot;);
		}

		istr1.str(coord1);
		istr1&gt;&gt;x1;
		istr2.str(coord2);
		istr2&gt;&gt;x2;
		istr3.str(coord3);
		istr3&gt;&gt;x3;
                  istr.str(str3);
		istr&gt;&gt;str2;
		istr&gt;&gt;ID;
</code></pre>
<p>Das ist nur der wichtige Teil, falls ein paar Deklarationen fehlen bitte ich dies zu entschuldigen. Ich hoffe es hilft vielleicht jem der das selbe Problem hat. Ist zwar vielleicht nicht sehr elegant aber es funktioniert. Es wird dabei auch zwischen mit und ohne führenden Minuszeichen und Minus hinter dem Dezimalpunkt unterschieden. Im zweitem Fall wird an der Stelle des Minus ein e für den Exponentialteil eingefügt. Die oben dargestellte Zeile kann somit wie gewünscht ausgelesen werden.<br />
LG Gebb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211658</guid><dc:creator><![CDATA[Gebb]]></dc:creator><pubDate>Tue, 15 May 2012 06:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Tue, 15 May 2012 20:25:16 GMT]]></title><description><![CDATA[<p>Gebb schrieb:</p>
<blockquote>
<p>ich muss eine ASCII-Datei auslesen. In dieser Datei stehen Zeilen wie diese:</p>
<pre><code>GRID     21864          -.4604962.-10   -1.55256
</code></pre>
<p>Dabei ist GRID ein Schlüsselwort, 21864 eine ID und der letzte Zahlenblock sind 3 Koordinaten. Die Datei basiert glaube ich noch auf Fortran. Jede Koordinate hat 8Stellen.</p>
</blockquote>
<p>Hallo Gebb,</p>
<p>wie schon gesagt, ist das mit Hausmitteln nicht möglich, insbesondere auch deshalb nicht, weil die Zahlen ohne Trennzeichen (Zwischenraum) hinter einander stehen. Man kann aber den Code, der eine Zahl liest gegen ein Stück selbst geschriebenen Code austauschen - das ist die sogenannte Facette <a href="http://www.cplusplus.com/reference/std/locale/num_get/" rel="nofollow">num_get</a>. In vorliegendem Fall die <a href="http://www.cplusplus.com/reference/std/locale/num_get/get/" rel="nofollow">Methode, die einen double-Wert liest</a>. Und weil die Zahlen hinter einander stehen, muss der Facette auch vorher mitgeteilt werden, wo die erste Zahl aufhört und die zweite anfängt - also wie lang die Zahl ist, ich verwende dazu den Manipulator <a href="http://www.cplusplus.com/reference/iostream/manipulators/setw/" rel="nofollow">std::setw</a>, deren Wert ich später mit <a href="http://www.cplusplus.com/reference/iostream/ios_base/width/" rel="nofollow">width</a> auslese.</p>
<p>Das ist wahrlich kein Anfänger-Code, aber im Grunde die einzige Möglichkeit, wie man das sauber hin bekommt.</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;locale&gt; // isspace, u.a.
#include &lt;iomanip&gt; // setw
#include &lt;cmath&gt; // pow
#include &lt;string&gt;

// --   liest eine linksbündige Zahl, mit einer definierten Länge ein.
//      Der (optionale) Exponent steht als Integer (ohne 'E') unmittelbar
//      hinter der Mantisse.
//      Die Anzahl der Zeichen, die die Zahl einnimmt, MUSS vorher
//      mit setw(Breite) besetzt werden.
//      Beispiel:  setw(8) '2.-11   ' = 2.E-11
class FortranNumGet : public std::num_get&lt; char &gt;
{
protected:
    virtual iter_type do_get( iter_type src, iter_type to, std::ios_base&amp; ios_,
        std::ios_base::iostate&amp; err, double&amp; v ) const
    {
        const std::locale myLoc = ios_.getloc();
        int width = int(ios_.width(0));
        if( src == to )
        {
            err |= std::ios_base::failbit | std::ios_base::eofbit;
            return src;
        }
        if( width == 0 )
        {
            err |= std::ios_base::failbit;
            return src;
        }
        bool plus = true;
        char c = *src;
        // -- Vorzeichen lesen
        if( c == '-' )
        {
            ++src; --width;
            plus = false;
        }
        else if( c == '+' )
        {
            ++src; --width;
        }

        bool readdigit = false;
        v = 0.;
        // --   Vor- und Nachkommastellen bis 'Space' oder width==0
        const char punkt = std::use_facet&lt; std::numpunct&lt; char &gt; &gt;( myLoc ).decimal_point();
        double nk = 0.;
        for( ; width &gt; 0 &amp;&amp; src != to; --width, ++src )
        {
            c = *src;
            if( c &gt;= '0' &amp;&amp; c &lt;= '9' )
            {
                readdigit = true;
                (v *= 10) += int(c - '0');
                nk *= 10;
            }
            else if( c == punkt )
            {
                if( nk != 0. )
                {
                    err |= std::ios_base::failbit; // Dezimaltrenner doppelt
                    return src;
                }
                nk = 1.;
            }
            else
                break;
        }
        if( !readdigit )
        {
            err |= std::ios_base::failbit;
            return src;
        }
        if( nk != 0. )
            v /= nk;
        if( !plus )
            v = -v;

        // -- ggf. Exponenent lesen (ohne 'E'!)
        if( width &gt; 0 &amp;&amp; src != to &amp;&amp; (c == '-' || c == '+'))
        {
            plus = (c == '+');
            --width; ++src; // Vorzeichen schlucken
            readdigit = false;
            int expo = 0;
            for( ; width &gt; 0 &amp;&amp; src != to; --width, ++src )
            {
                c = *src;
                if( c &gt;= '0' &amp;&amp; c &lt;= '9' )
                {
                    readdigit = true;
                    (expo *= 10) += int(c - '0');
                }
                else
                    break;
            }
            if( !readdigit )
            {
                err |= std::ios_base::failbit; // hinter dem Exponentenvorzeichen kommt keine Ziffer
                return src;
            }
            v *= std::pow( 10., plus? expo: -expo );
        }

        // --   Füllcharacter überlesen
        for( ; width &gt; 0 &amp;&amp; src != to &amp;&amp; isspace( *src, myLoc ); --width, ++src )
            ;

        if( width &gt; 0 &amp;&amp; src != to )
            err |= std::ios_base::failbit; // unerwartetes Zeichen gefunden
        return src;
    }
};

// -----------------------
struct Eintrag
{
    int ID; // eine ID
    double x, y, z; // 3 Koordinaten
};
// --   Eintrag Lesen und Schreiben
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Eintrag&amp; e )
{
    using std::setw;
    return in &gt;&gt; e.ID &gt;&gt; setw(8) &gt;&gt; e.x &gt;&gt; setw(8) &gt;&gt; e.y &gt;&gt; setw(8) &gt;&gt; e.z;
}
std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Eintrag&amp; e )
{
    return out &lt;&lt; e.ID &lt;&lt; &quot; {&quot; &lt;&lt; e.x &lt;&lt; &quot; &quot; &lt;&lt; e.y &lt;&lt; &quot; &quot; &lt;&lt; e.z &lt;&lt; &quot;}&quot;;
}

int main()
{
    using namespace std;
    ifstream in(&quot;input.txt&quot;);
    if( !in.is_open() )
    {
        cerr &lt;&lt; &quot;kann Datei nicht oeffnen&quot; &lt;&lt; endl;
        return -2;
    }

    in.imbue( locale( in.getloc(), new FortranNumGet ) );
    for( string schluessel; in &gt;&gt; schluessel; )
    {
        if( schluessel == &quot;GRID&quot; )
        {
            Eintrag e;
            if( in &gt;&gt; e )
                cout &lt;&lt; &quot;Gelesen: &quot; &lt;&lt; e &lt;&lt; endl;
        }
        else
        {
            cout &lt;&lt; &quot;unbekanntes Schluesselwort: &quot; &lt;&lt; schluessel &lt;&lt; endl;
            break;
        }
    }
    return 0;
}
</code></pre>
<p>Steht in der Datei 'input.txt' die eine von Dir beschrieben Zeile, so liefert obiges Programm folgenden Output:</p>
<pre><code>Gelesen: 21864 {-0.460496 2e-010 -1.55256}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211930</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 May 2012 20:25:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Zahlenformat mit C++ einlesen? on Wed, 16 May 2012 05:37:57 GMT]]></title><description><![CDATA[<p>Danke Werner,</p>
<p>ja da hast recht, dass ist echt kein Anfänger-Code. <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="😉"
    /> Selbst wenn ich mich nicht mehr als Anfänger bezeichnen würde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Aber funktioniert <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>LG Gebb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212031</guid><dc:creator><![CDATA[Gebb]]></dc:creator><pubDate>Wed, 16 May 2012 05:37:57 GMT</pubDate></item></channel></rss>