<?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 nach Variablen filtern. (einfachere Methode?)]]></title><description><![CDATA[<p>Hallo, ich habe eine Textdatei, die wie folgt aufgebaut ist:<br />
[url]<br />
<a href="https://www.fbi.h-da.de/fileadmin/personal/j.arz/PAD2/Katasteramt.txt%5B/url%5D" rel="nofollow">https://www.fbi.h-da.de/fileadmin/personal/j.arz/PAD2/Katasteramt.txt[/url]</a></p>
<p>jetzt muss ich die Textdate nach den Variablen Grundbuch, Gemarkung, Wirtschaftsart, Größe, sowie Lage filtern. So sieht mein Code bisher aus:</p>
<pre><code>void Grundstuecksverwaltung::einlesen()
{
	gListe = new GrundstueckListe;

	fstream mystream(&quot;katasteramt.txt&quot;);
	string buffer;

	string grundbuch;
	string gemarkung;
	string wirtschaftsart;
	double groesse;
	string lage;

	getline(mystream, buffer);

	getline(mystream, buffer, ' ');
	getline(mystream, buffer, ' ');

	getline(mystream, buffer, '\n');

	grundbuch = buffer;

	for (int i = 0; i &lt; 4; i++)
	{
		getline(mystream, buffer);
	}

	while (!mystream.eof()){
		getline(mystream, buffer);
		getline(mystream, buffer, ' ');
		if (buffer.size() &gt; 0){                //nach leerzeichen abfragen
			if (buffer.size() &gt; 0){
				if (buffer.at(0) == '*')
				{
					getline(mystream, buffer, ' ');
					getline(mystream, buffer, '\n');
					grundbuch = buffer;
					for (int i = 0; i &lt; 5; i++)
					{
						getline(mystream, buffer);
					}

					getline(mystream, buffer, ' ');

					//mystream.clear(); // clear stream flags and error state
					//mystream.seekg(0, ios::beg); // reset read position
				}
			}

			gemarkung = buffer;

			getline(mystream, buffer, ' ');

			while (buffer.size() == 0)
			{
				getline(mystream, buffer, ' ');
			}

			wirtschaftsart = buffer;

			getline(mystream, buffer, ' ');

			while (buffer.size() == 0)
			{
				getline(mystream, buffer, ' ');
			}

			groesse = atof(buffer.c_str());

			getline(mystream, buffer);

			lage = buffer.substr(9, buffer.size());

			GrundstueckElement* element = new GrundstueckElement;
			element-&gt;setGrundbuch(grundbuch);
			element-&gt;setGemarkung(gemarkung);
			element-&gt;setWirtschaftsart(wirtschaftsart);
			element-&gt;setGroesse(groesse);
			element-&gt;setLage(lage);

			gListe-&gt;insertLast(element);

		}
		else{ break; }
	}
}
</code></pre>
<p>Meine Frage wäre, ob es eine einfachere Methode gibt die Textdatei zu filtern. Z.b. nerven mich die getlines -</p>
<pre><code>if (buffer.size() &gt; 0)
</code></pre>
<p>ich suche eine elegantere Methode um das Problem zu lösen. Wäre toll, wenn mir da jemand helfen könnte.</p>
<p>LG <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/326166/textdatei-nach-variablen-filtern-einfachere-methode</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 09:30:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326166.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Jun 2014 21:52:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Wed, 04 Jun 2014 21:52:23 GMT]]></title><description><![CDATA[<p>Hallo, ich habe eine Textdatei, die wie folgt aufgebaut ist:<br />
[url]<br />
<a href="https://www.fbi.h-da.de/fileadmin/personal/j.arz/PAD2/Katasteramt.txt%5B/url%5D" rel="nofollow">https://www.fbi.h-da.de/fileadmin/personal/j.arz/PAD2/Katasteramt.txt[/url]</a></p>
<p>jetzt muss ich die Textdate nach den Variablen Grundbuch, Gemarkung, Wirtschaftsart, Größe, sowie Lage filtern. So sieht mein Code bisher aus:</p>
<pre><code>void Grundstuecksverwaltung::einlesen()
{
	gListe = new GrundstueckListe;

	fstream mystream(&quot;katasteramt.txt&quot;);
	string buffer;

	string grundbuch;
	string gemarkung;
	string wirtschaftsart;
	double groesse;
	string lage;

	getline(mystream, buffer);

	getline(mystream, buffer, ' ');
	getline(mystream, buffer, ' ');

	getline(mystream, buffer, '\n');

	grundbuch = buffer;

	for (int i = 0; i &lt; 4; i++)
	{
		getline(mystream, buffer);
	}

	while (!mystream.eof()){
		getline(mystream, buffer);
		getline(mystream, buffer, ' ');
		if (buffer.size() &gt; 0){                //nach leerzeichen abfragen
			if (buffer.size() &gt; 0){
				if (buffer.at(0) == '*')
				{
					getline(mystream, buffer, ' ');
					getline(mystream, buffer, '\n');
					grundbuch = buffer;
					for (int i = 0; i &lt; 5; i++)
					{
						getline(mystream, buffer);
					}

					getline(mystream, buffer, ' ');

					//mystream.clear(); // clear stream flags and error state
					//mystream.seekg(0, ios::beg); // reset read position
				}
			}

			gemarkung = buffer;

			getline(mystream, buffer, ' ');

			while (buffer.size() == 0)
			{
				getline(mystream, buffer, ' ');
			}

			wirtschaftsart = buffer;

			getline(mystream, buffer, ' ');

			while (buffer.size() == 0)
			{
				getline(mystream, buffer, ' ');
			}

			groesse = atof(buffer.c_str());

			getline(mystream, buffer);

			lage = buffer.substr(9, buffer.size());

			GrundstueckElement* element = new GrundstueckElement;
			element-&gt;setGrundbuch(grundbuch);
			element-&gt;setGemarkung(gemarkung);
			element-&gt;setWirtschaftsart(wirtschaftsart);
			element-&gt;setGroesse(groesse);
			element-&gt;setLage(lage);

			gListe-&gt;insertLast(element);

		}
		else{ break; }
	}
}
</code></pre>
<p>Meine Frage wäre, ob es eine einfachere Methode gibt die Textdatei zu filtern. Z.b. nerven mich die getlines -</p>
<pre><code>if (buffer.size() &gt; 0)
</code></pre>
<p>ich suche eine elegantere Methode um das Problem zu lösen. Wäre toll, wenn mir da jemand helfen könnte.</p>
<p>LG <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/2402475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402475</guid><dc:creator><![CDATA[Array12]]></dc:creator><pubDate>Wed, 04 Jun 2014 21:52:23 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Wed, 04 Jun 2014 22:03:09 GMT]]></title><description><![CDATA[<p><a href="http://www.meintext.de/?text=377725831401919197" rel="nofollow">http://www.meintext.de/?text=377725831401919197</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402477</guid><dc:creator><![CDATA[Array12]]></dc:creator><pubDate>Wed, 04 Jun 2014 22:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Wed, 04 Jun 2014 22:24:14 GMT]]></title><description><![CDATA[<p>Jetzt hast du zwei extrem unterschiedliche Formate gezeigt. Wo ist denn da die Gemeinsamkeit? Ich war ja beim ersten Beitrag davon ausgegangen, dass die Breite der Einträge immer gleich ist. Das zweite Format hingegen sieht recht kompliziert aus.</p>
<p>Manuelle Speicherverwaltung brauchst du hier höchstwahrscheinlich <em>nicht</em>. Dein Programm sollte hinterher ungefähr so aussehen (ich erspare mir mal die Übersetzung des Behördendeutschs):</p>
<pre><code>class Grundbucheintrag
{
  std::string gemarkung;
  std::string wirtschaftsart;
  std::string lage;
  double groesse;
  friend std::istream&amp; operator&gt;&gt;(std::istream&amp;, Grundbucheintrag&amp;);
};

class Grundbuch
{
  std::string gemeinde;
  std::vector&lt;Grundbucheintrag&gt; eintraege;
  friend std::istream&amp; operator&gt;&gt;(std::istream&amp;, Grundbuch&amp;);
};

istream&amp; operator&gt;&gt;(istream&amp; in, Grundbucheintrag&amp; eintrag)
{
  // Genaues Aussehen unbekannt, da Format unklar
}

istream&amp; operator&gt;&gt;(istream&amp; in, Grundbuch&amp; grundbuch)
{
  // Genaues Aussehen unbekannt, da Format unklar, aber besteht vermutlich aus:

  lesen_des_headers();

  for (Grundbucheintrag eintrag; in &gt;&gt; eintrag; )
    grundbuch.eintraege.push_back(eintrag);

  if (!in.eof())
    in.clear();

  return in;
}

int main()
{
  ifstream kataster(&quot;Katasteramt.txt&quot;);
  std::vector&lt;Grundbuch&gt; grundbuecher;
  for(Grundbuch grundbuch; kataster &gt;&gt; grundbuch; )
    grundbuecher.push_back(grundbuch); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2402479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402479</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 04 Jun 2014 22:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Wed, 04 Jun 2014 22:46:35 GMT]]></title><description><![CDATA[<p>Wenn ich aus der Textdatei herauskopiere, werden die Leerzeichen und Tabs leider wegeditiert. Zwischen den Gemarkungen, der Wirtschaftsart und Lage sind z.B. mehrere Leerzeichen. Ich suche schon nach einer Möglichkeit um es hier richtig anzeigen zu lassen. Tut mir erst mal leid für die Verwirrung...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402482</guid><dc:creator><![CDATA[Array12]]></dc:creator><pubDate>Wed, 04 Jun 2014 22:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Wed, 04 Jun 2014 22:54:29 GMT]]></title><description><![CDATA[<p><a href="https://docs.google.com/document/d/1vgjfk9nFj3JtBgo2Fk0PuPermuW1iV8egWDV6Gh0sfI/edit?usp=sharing" rel="nofollow">https://docs.google.com/document/d/1vgjfk9nFj3JtBgo2Fk0PuPermuW1iV8egWDV6Gh0sfI/edit?usp=sharing</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402483</guid><dc:creator><![CDATA[Array12]]></dc:creator><pubDate>Wed, 04 Jun 2014 22:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Thu, 05 Jun 2014 06:11:49 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht deinen Text, schmeißt überflüssige Einträge raus und stellst ihn hier mit Code-Tags rein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402496</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 05 Jun 2014 06:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Thu, 05 Jun 2014 10:06:40 GMT]]></title><description><![CDATA[<p>.. habe mal den Vorschlag von SeppJ aufgegriffen:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;limits&gt;
#include &lt;string&gt;
#include &lt;list&gt;

struct GrundstueckElement
{
    std::string Grundbuch;
    std::string Gemarkung;
    std::string Wirtschaftsart;
    std::string Lage;
    double Groesse;
};

// --   liest einen Text ein, der auch von White-Space-Character
//      unterbrochen werden darf; bis Zeilenende oder einer Ziffer
struct text
{
    explicit text( std::string&amp; str ) : str_( str ) {}
    std::string&amp; str_;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, text t );

// --   liest ein 'GrundstueckElement'
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, GrundstueckElement&amp; g )
{
    in &gt;&gt; g.Gemarkung &gt;&gt; text(g.Wirtschaftsart) &gt;&gt; g.Groesse;
    getline( in &gt;&gt; std::ws, g.Lage );
    return in;
}

std::istream&amp; skipline( std::istream&amp; in ) // überliest eine Zeile
{
    return  in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' );
}
std::istream&amp; skipword( std::istream&amp; in ) // überliest ein Wort
{
    return (in &gt;&gt; std::ws).ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), ' ' );
}

// --   liest den Grunbuchheader, falls vorhanden, sonst tue nichts! 
struct GrundbuchHeader
{
    GrundbuchHeader( std::string&amp; str ) : str_( str ) {}
    std::string&amp; str_;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, GrundbuchHeader gh )
{
    char c;
    if( in &gt;&gt; c )
    {
        if( c == '*' )  // Grundbuch-Eintrag beginnt
        {
            getline( in &gt;&gt; skipline &gt;&gt; skipword &gt;&gt; skipword &gt;&gt; std::ws, gh.str_ );
            for( int zeile=0; zeile&lt;4; ++zeile ) // 4 weitere Zeilen überspringen
                in &gt;&gt; skipline;
        }
        else
            in.putback(c); // zu viel gelesenes Zeichen zurück stellen
    }
    return in;
}

int main()
{
    using namespace std;
    std::list&lt; GrundstueckElement &gt; liste;
    ifstream in(&quot;kataster.txt&quot;);
    if( !in.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei&quot; &lt;&lt; endl;
        return -2;
    }
    string grundbuch;
    for( GrundstueckElement ge; in &gt;&gt; GrundbuchHeader(grundbuch) &gt;&gt; ge; )
    {
        ge.Grundbuch = grundbuch;
        liste.push_back( ge );
    }
    if( in.eof() )
        cout &lt;&lt; &quot;Ok - Dateiende erreicht&quot; &lt;&lt; endl;
    cout &lt;&lt; liste.size() &lt;&lt; &quot; Eintraege gelesen&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>das wirkliche Problem war der letzte Eintrag, wo die Wirtschaftsart aus mehr als einem Wort besteht (' <code>2620/1745 Grünland. Wiese 87.85</code> '). Dazu musste dann das Helferlein <code>text</code> her (s. oben Zeile 28)</p>
<pre><code>std::istream&amp; operator&gt;&gt;( std::istream&amp; in, text t )
{
    std::istream::sentry ok( in );
    if( ok )
    {
        std::ios_base::iostate state = std::ios_base::goodbit;
        try
        {
            typedef std::istream::traits_type Traits;
            std::string str;
            std::string::size_type len = 0;
            const std::ctype&lt; char &gt;&amp; ct = std::use_facet&lt; std::ctype&lt; char &gt; &gt;( in.getloc() );
            for( Traits::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
            {
                if( Traits::eq_int_type( m, Traits::eof() ) )
                {
                    state |= std::ios_base::eofbit;
                    break;
                }
                const char c = Traits::to_char_type( m );
                if( ct.is( std::ctype_base::digit, c ) || c == '\n' )
                    break;
                str.append( 1, c );
                if( !ct.is( std::ctype_base::space, c ) )
                    len = str.length();
            }
            t.str_ = str.substr( 0, len );
        }
        catch(...)
        {
            state |= std::ios_base::badbit;
            if( in.exceptions() &amp; std::ios_base::badbit )
                throw;
        }
        in.setstate( state );
    }
    return in;
}
</code></pre>
<p>zum Thema &quot;wie funktioniert operator&gt;&gt;( std::istream&amp; in, text t )?&quot; siehe auch hier: <a href="http://www.c-plusplus.net/forum/p2256837#2256837" rel="nofollow">http://www.c-plusplus.net/forum/p2256837#2256837</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402520</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 05 Jun 2014 10:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Textdatei nach Variablen filtern. (einfachere Methode?) on Sun, 08 Jun 2014 08:48:20 GMT]]></title><description><![CDATA[<p>Formuliere doch das Dateiformat erst mal als (E)BNF, macht vieles leichter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402953</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 08 Jun 2014 08:48:20 GMT</pubDate></item></channel></rss>