<?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[Dateiinhalte richtig formatieren und auslesen]]></title><description><![CDATA[<p>Hallo liebe Comm,</p>
<p>ich möchte gerne, wie es im Titel schon steht, eine Datei haben, die ich gezielt auslesen kann. Angenommen die Datei sieht folgendermaßen aus:</p>
<pre><code>Item 1:
Holzschild
Kosten 300 Gold
10 Verteidigung

Item 2:
Eisenschild
Kosten 700 Gold
15 Verteidigung
</code></pre>
<p>Stellt euch vor, es würden noch viele mehr Items gleich aufgebaut folgen.</p>
<p>Wie mache ich nun, dass das Programm alles ausliest und dabei die Items büdelt und so weiß, was zu was gehört. Außerdem muss er irgendwie kontrollieren, ob auch alles korrekt angegeben ist, sodass, wenn z.b. die Datei beschädigt ist und der Inhalt nicht richtig ist, sagen wir, bei Item 2 fehlt das &quot;Gold&quot; Feld, er das auch merkt.<br />
Da muss ich doch die Datei irgendwie formatieren, oder?</p>
<p>Ich bitte um eure Ratschläge und vielleicht hat sowas ja schonmal jemand gemacht.</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305828/dateiinhalte-richtig-formatieren-und-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:25:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305828.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jul 2012 16:41:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateiinhalte richtig formatieren und auslesen on Mon, 09 Jul 2012 16:41:00 GMT]]></title><description><![CDATA[<p>Hallo liebe Comm,</p>
<p>ich möchte gerne, wie es im Titel schon steht, eine Datei haben, die ich gezielt auslesen kann. Angenommen die Datei sieht folgendermaßen aus:</p>
<pre><code>Item 1:
Holzschild
Kosten 300 Gold
10 Verteidigung

Item 2:
Eisenschild
Kosten 700 Gold
15 Verteidigung
</code></pre>
<p>Stellt euch vor, es würden noch viele mehr Items gleich aufgebaut folgen.</p>
<p>Wie mache ich nun, dass das Programm alles ausliest und dabei die Items büdelt und so weiß, was zu was gehört. Außerdem muss er irgendwie kontrollieren, ob auch alles korrekt angegeben ist, sodass, wenn z.b. die Datei beschädigt ist und der Inhalt nicht richtig ist, sagen wir, bei Item 2 fehlt das &quot;Gold&quot; Feld, er das auch merkt.<br />
Da muss ich doch die Datei irgendwie formatieren, oder?</p>
<p>Ich bitte um eure Ratschläge und vielleicht hat sowas ja schonmal jemand gemacht.</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231397</guid><dc:creator><![CDATA[kralo9]]></dc:creator><pubDate>Mon, 09 Jul 2012 16:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Dateiinhalte richtig formatieren und auslesen on Mon, 09 Jul 2012 16:50:42 GMT]]></title><description><![CDATA[<p>ich würde mir eine grammatik bauen die sowas alles vorsieht, dazu kann man sich dann einen parser konfigurieren (z.B. boost::spirit, google ruhig mal) und den lässt man das auch noch verarbeiten</p>
<p>soviel zur theorie, praktisch wird es da aber sicher das ein oder andere problem geben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231399</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 09 Jul 2012 16:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to Dateiinhalte richtig formatieren und auslesen on Mon, 09 Jul 2012 16:51:38 GMT]]></title><description><![CDATA[<p>Wäre eine Möglichkeit, kommt drauf an wie komplex die Datei ist.<br />
Du könntest die Datei einfach zeilenweise einlesen. Dann die einzelnen Zeilen überprüfen ob es ein neues Item ist, ansonsten einfach dem letzten Item zuordnen (und überprüfen ob die Zeile korrekt ist oder was fehlt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231400</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Mon, 09 Jul 2012 16:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Dateiinhalte richtig formatieren und auslesen on Mon, 09 Jul 2012 18:37:31 GMT]]></title><description><![CDATA[<p>Hallo Kralo9,</p>
<p>mache Dir für jedes Attribut eine kleine <code>struct</code> , und füge einen Streaming-Operator hinzu, so daß Du eine Instanz dieser <code>struct</code> Lesen und ggf. auch schreiben kannst. Dort kannst Du dann auch abfragen, ob die erwarteten Schlüsselwörter in der Datei stehen.<br />
Daneben ist es sinnvoll eine kleine Helferstruktur (hier <code>check</code> s.u) zu bauen, die bestimmte Worte überprüft. Alles zusammen etwa so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt; // std::find
#include &lt;vector&gt;

struct Schild
{
    enum Art { Holz=0, Eisen, Titan };
    Art art;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Schild&amp; schild )
{
    static std::string const arten[] = {&quot;Holzschild&quot;, &quot;Eisenschild&quot;, &quot;Titanschild&quot;};
    std::string s;
    int idx;
    if( in &gt;&gt; s &amp;&amp; (idx = std::find( arten, arten+sizeof(arten)/sizeof(*arten), s ) - arten) &gt;= sizeof(arten)/sizeof(*arten) )
        in.setstate( std::ios_base::failbit ); // Lesefehler, eingelesener Schildtyp ist unbekannt
    else if( in ) // alles ok
        schild.art = Schild::Art( idx );
    return in;
}

struct check
{
    check( const std::string&amp; key ) : key_( key ) {}
    std::string key_;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, check c )
{
    std::string w;
    if( in &gt;&gt; w &amp;&amp; w != c.key_ )
        in.setstate( std::ios_base::failbit ); // das erwartet Wort 'wort' folgte nicht
    return in;
}

struct Preis
{
    int wertInGold_;
};
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Preis&amp; preis )
{
    return in &gt;&gt; preis.wertInGold_ &gt;&gt; check(&quot;Gold&quot;);
}

class Item
{
public:
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Item&amp; item );
private:
    int nr_;
    Schild schild_;
    Preis preis_;
    int staerke_;
};

// --   ein Item einlesen
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Item&amp; item )
{
    in &gt;&gt; check(&quot;Item&quot;) &gt;&gt; item.nr_ &gt;&gt; check(&quot;:&quot;);
    in &gt;&gt; item.schild_;
    in &gt;&gt; check(&quot;Kosten&quot;) &gt;&gt; item.preis_;
    in &gt;&gt; item.staerke_ &gt;&gt; check(&quot;Verteidigung&quot;);
    return in;
}

int main()
{
    using namespace std;
    vector&lt; Item&gt; items;
    ifstream datei(&quot;input.txt&quot;);
    if( !datei.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei&quot; &lt;&lt; endl;
        return -2;
    }
    for( Item i; datei &gt;&gt; i; )
        items.push_back( i );
    cout &lt;&lt; items.size() &lt;&lt; &quot; Eintraege gelesen&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231430</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 09 Jul 2012 18:37:31 GMT</pubDate></item></channel></rss>