<?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[Textdatei einlesen und verarbeiten]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin neu hier und programmiere sonst in Java.</p>
<p>Nun wollte ich mit C++ Dateien einlesen und den Inhalt verarbeiten. Folgendes Problem: in einer Textdatei stehen Koordinaten für Punkte im Raum:</p>
<pre><code>#Point 6
Location 19.5 19.5 29.23470688
	-0.2045922279 0 0
	0 0.2045922279 0
	0 0 -0.4410593808
</code></pre>
<p>Das ist zum Beispiel ein Punkt, dessen Koordinaten nach dem Wort 'Location' kommen. In der Datei gibt es prinzipiell beliebig viele solcher Punktblöcke, getrennt mit einem (!) Leerzeichen. Der Aufbau der Blöcke ist immer so wie oben beschrieben.</p>
<p>Nun wollte ich aus der ganzen Datei alle Punkte mir ihren Koordinaten einlesen. Nach etwas mehr als einem Tag habe ich folgende Lösung. Elegant sieht vielleicht anders aus, deshalb hier meine Frage, wie ginge es denn eleganter? Danke schonmal <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="😉"
    /> Man will ja dazu lernen <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="😃"
    /></p>
<pre><code class="language-cpp">void qvc::Skeleton::Load(const char* fileName)  
{
  std::ifstream in (fileName);
  if(!in.is_open())
  {
    std::cout &lt;&lt; &quot;Could not read file at &quot; &lt;&lt; fileName &lt;&lt; &quot; for loading data&quot; &lt;&lt; std::endl;
    return;
  }

  char lineBuffer[256];
  char* lineToken;

  for(int i = 0; i &lt; 6 &amp;&amp; in.good(); i++) // Am Anfang der Datei stehen noch sechs Kopfzeilen, also einfach überspringen
  {
    in.getline(lineBuffer, 256);
  }

  while(in.good())
  {
    in.getline(lineBuffer, 256, '\n');
    if(!IsPointLine(lineBuffer))
    {
      continue;
    }

    in.getline(lineBuffer, 256, ' ');
    in.getline(lineBuffer, 256, ' ');
    float x = (float)strtod(lineBuffer, &amp;lineToken);

    in.getline(lineBuffer, 256, ' ');
    float y = (float)strtod(lineBuffer, &amp;lineToken);

    in.getline(lineBuffer, 256, ' ');
    float z = (float)strtod(lineBuffer, &amp;lineToken);

    std::cout &lt;&lt; &quot;(&quot; &lt;&lt; x &lt;&lt; &quot;,&quot; &lt;&lt; y &lt;&lt; &quot;,&quot; &lt;&lt; z &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

    qvc::Point cp(x,y,z);

    this-&gt;criticalPoints-&gt;push_back(&amp;cp);
  }

  in.clear();
  in.close();
}

bool qvc::Skeleton::IsPointLine(const char* line)
{
  if(strlen(line) &gt; 9)
  {
    return false;
  }

  int i = 0;

  if(line[i++] != '#') return false;
  if(line[i++] != 'P') return false;
  if(line[i++] != 'o') return false;
  if(line[i++] != 'i') return false;
  if(line[i++] != 'n') return false;
  if(line[i++] != 't') return false;

  return true;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/277441/textdatei-einlesen-und-verarbeiten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 22:47:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277441.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Nov 2010 18:11:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Textdatei einlesen und verarbeiten on Thu, 18 Nov 2010 18:11:18 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin neu hier und programmiere sonst in Java.</p>
<p>Nun wollte ich mit C++ Dateien einlesen und den Inhalt verarbeiten. Folgendes Problem: in einer Textdatei stehen Koordinaten für Punkte im Raum:</p>
<pre><code>#Point 6
Location 19.5 19.5 29.23470688
	-0.2045922279 0 0
	0 0.2045922279 0
	0 0 -0.4410593808
</code></pre>
<p>Das ist zum Beispiel ein Punkt, dessen Koordinaten nach dem Wort 'Location' kommen. In der Datei gibt es prinzipiell beliebig viele solcher Punktblöcke, getrennt mit einem (!) Leerzeichen. Der Aufbau der Blöcke ist immer so wie oben beschrieben.</p>
<p>Nun wollte ich aus der ganzen Datei alle Punkte mir ihren Koordinaten einlesen. Nach etwas mehr als einem Tag habe ich folgende Lösung. Elegant sieht vielleicht anders aus, deshalb hier meine Frage, wie ginge es denn eleganter? Danke schonmal <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="😉"
    /> Man will ja dazu lernen <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="😃"
    /></p>
<pre><code class="language-cpp">void qvc::Skeleton::Load(const char* fileName)  
{
  std::ifstream in (fileName);
  if(!in.is_open())
  {
    std::cout &lt;&lt; &quot;Could not read file at &quot; &lt;&lt; fileName &lt;&lt; &quot; for loading data&quot; &lt;&lt; std::endl;
    return;
  }

  char lineBuffer[256];
  char* lineToken;

  for(int i = 0; i &lt; 6 &amp;&amp; in.good(); i++) // Am Anfang der Datei stehen noch sechs Kopfzeilen, also einfach überspringen
  {
    in.getline(lineBuffer, 256);
  }

  while(in.good())
  {
    in.getline(lineBuffer, 256, '\n');
    if(!IsPointLine(lineBuffer))
    {
      continue;
    }

    in.getline(lineBuffer, 256, ' ');
    in.getline(lineBuffer, 256, ' ');
    float x = (float)strtod(lineBuffer, &amp;lineToken);

    in.getline(lineBuffer, 256, ' ');
    float y = (float)strtod(lineBuffer, &amp;lineToken);

    in.getline(lineBuffer, 256, ' ');
    float z = (float)strtod(lineBuffer, &amp;lineToken);

    std::cout &lt;&lt; &quot;(&quot; &lt;&lt; x &lt;&lt; &quot;,&quot; &lt;&lt; y &lt;&lt; &quot;,&quot; &lt;&lt; z &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

    qvc::Point cp(x,y,z);

    this-&gt;criticalPoints-&gt;push_back(&amp;cp);
  }

  in.clear();
  in.close();
}

bool qvc::Skeleton::IsPointLine(const char* line)
{
  if(strlen(line) &gt; 9)
  {
    return false;
  }

  int i = 0;

  if(line[i++] != '#') return false;
  if(line[i++] != 'P') return false;
  if(line[i++] != 'o') return false;
  if(line[i++] != 'i') return false;
  if(line[i++] != 'n') return false;
  if(line[i++] != 't') return false;

  return true;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1982437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982437</guid><dc:creator><![CDATA[AlexSpritze]]></dc:creator><pubDate>Thu, 18 Nov 2010 18:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei einlesen und verarbeiten on Thu, 18 Nov 2010 20:04:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void qvc::Skeleton::Load(const char* fileName) // alles ungetestet
{
  std::ifstream in (fileName);
  if(!in.is_open()) {
    std::cerr &lt;&lt; &quot;Could not read file at &quot; &lt;&lt; fileName &lt;&lt; &quot; for loading data&quot; &lt;&lt; std::endl;
    return;
  }
  const std::streamsize max_size = std::numeric_limits&lt;std::streamsize&gt;::max(); // benötigt #include &lt;limits&gt;
  // Am Anfang der Datei stehen noch sechs Kopfzeilen, also einfach überspringen
  for (int i = 0; i &lt; 6 &amp;&amp; in.good(); i++, in.ignore(max_size, '\n'));
  for (std::string buffer(std::getline(in)); in.good(); buffer=std::getline(in)) {
    if (buffer.compare(0, 6, &quot;#Point&quot;)) // Funktionalität von !IsPointLine(lineBuffer)
      continue;
    float x, y, z;
    in &gt;&gt; x &gt;&gt; y &gt;&gt; z; // ignoriert Leerzeichen
    std::cout &lt;&lt; &quot;(&quot; &lt;&lt; x &lt;&lt; &quot;,&quot; &lt;&lt; y &lt;&lt; &quot;,&quot; &lt;&lt; z &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
    criticalPoints-&gt;push_back(new/*?*/ qvc::Point(x,y,z));
  }
  // in.clear() und in.close() werden automatisch aufgerufen (dank RAII)
}
</code></pre>
<p>Ist zwar ungetestet, müsste aber funktionieren.<br />
Folgende zwei Zeilen von dir verstehe ich nicht ganz:</p>
<pre><code class="language-cpp">qvc::Point cp(x,y,z); // eine neue Variable, von der am Ende des Durchlaufs der Destruktor aufgerufen wird und sie zerstört
this-&gt;criticalPoints-&gt;push_back(&amp;cp); // hier übergibst du eine Referenz auf ein temporäres Objekt
// das this ist übrigens unnötig
</code></pre>
<p>Frage: wie sieht deine Klasse denn aus?</p>
<pre><code class="language-cpp">class Skeleton {
public:
  void Load(const char *filename);
private:
  std::vector&lt;Point *&gt; *criticalPoints;
};
</code></pre>
<p>Falls ja, dann rate ich dir dringend auf die hässlichen Pointer zu verzichten. Denn du musst für jeden Zeiger einen Destruktor aufrufen, was du vermutlich vergessen hast und damit ein Speicherleck erzeugt hast. Ausserdem ist das dauernde dereferenzieren unnötig langsam. Ein</p>
<pre><code class="language-cpp">std::vector&lt;Point&gt; criticalPoints;
</code></pre>
<p>reicht völlig aus, dann kannst du bei meinem Code auf Zeile 17 das &quot; <code>new/*?*/</code> &quot; rausnehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982531</guid><dc:creator><![CDATA[noja]]></dc:creator><pubDate>Thu, 18 Nov 2010 20:04:30 GMT</pubDate></item></channel></rss>