<?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[String zu enum]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch neu in C++ und finde keine elegante Methode mein Problem zu lösen.<br />
Ich habe eine Datei voller Strings. Nun möchte ich diese Strings einlesen und in einem enum speichern.<br />
Also so ungefähr:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;

enum Color {Red, Green, Blue};

int main() {
Color color;
std::ifstream ifs(&quot;color.txt&quot;);
ifs &gt;&gt; color;
};
</code></pre>
<p>Nun meckert der Compiler natürlich, dass es dafür keinen geeigneten Operator gibt. Das ganze erst in einen String einzulesen und dann auf Fehler überprüfen erscheint mir aber viel zu komplex.<br />
Gibt es dafür auch eine elegantere Methode?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294338/string-zu-enum</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 22:38:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294338.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Oct 2011 13:08:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:12:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch neu in C++ und finde keine elegante Methode mein Problem zu lösen.<br />
Ich habe eine Datei voller Strings. Nun möchte ich diese Strings einlesen und in einem enum speichern.<br />
Also so ungefähr:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;

enum Color {Red, Green, Blue};

int main() {
Color color;
std::ifstream ifs(&quot;color.txt&quot;);
ifs &gt;&gt; color;
};
</code></pre>
<p>Nun meckert der Compiler natürlich, dass es dafür keinen geeigneten Operator gibt. Das ganze erst in einen String einzulesen und dann auf Fehler überprüfen erscheint mir aber viel zu komplex.<br />
Gibt es dafür auch eine elegantere Methode?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134720</guid><dc:creator><![CDATA[Blattasar]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:11:30 GMT]]></title><description><![CDATA[<p>Du musst den Operator überladen.</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Color&amp; c)
{
    std::string s;
    is &gt;&gt; s;

    if(s == &quot;Red&quot;)
        c = Red;

    else if(s == &quot;Green&quot;)
        c = Green;

    else if(s == &quot;Blue&quot;)
        c = Blue;

    else
        is.setstate(ios_base::failbit);

    return is;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2134722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134722</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:17:00 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;fstream&gt;

enum Color {Red=0, Green=1, Blue=2};

int main() {
    Color color;
    std::ifstream ifs(&quot;color.txt&quot;);
    ifs &gt;&gt; color;
};
</code></pre>
<p>Und da sollen in der Datei auch 0 1 2 stehen. Schon ist das Problem weg.</p>
<p>Nach dem Compilieren sind die Namen der enums weg. Du müßtest schon mit strings arbeiten und vergleichen udn so Sachen machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134724</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:16:00 GMT]]></title><description><![CDATA[<p>Also in der Datei stehen richtige Worte a la &quot;Red&quot;, &quot;Green&quot;, &quot;Blue&quot;? Falls ja, gibt es da keinen direkten Weg, da die Bezeicher in deinem Programm (also die enum-Werte Red, Green, Blue) zur Laufzeit nicht mehr existieren. Eine relativ leichte Möglichkeit wäre es, eine map zu machen, die wirklich die Strings &quot;Red&quot;, &quot;Green&quot; und &quot;Blue&quot; auf die passenden enum-Werte mappt <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="😉"
    /> . Dann liest du strings aus der Datei ein. Findest du den String in der map, nimmst du den gemappten Wert. Ansonsten Lesefehler. Das ganze kannst du in einem eigenen überladenen Operator für dein enum Color machen, dann sieht das Hauptprogramm praktisch genau so aus wie jetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134727</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:32:55 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Du musst den Operator überladen.</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Color&amp; c)
{
    std::string s;
    is &gt;&gt; s;

    if(s == &quot;Red&quot;)
        c = Red;

    else if(s == &quot;Green&quot;)
        c = Green;

    else if(s == &quot;Blue&quot;)
        c = Blue;

    else
        is.setstate(ios_base::failbit);

    return is;
}
</code></pre>
</blockquote>
<p>Lahm. Aber hab ich dir das nicht schon ein paarmal erklärt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134738</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:32:55 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:36:36 GMT]]></title><description><![CDATA[<p>Da hast du Recht, an die map hab ich gerade überhaupt nicht gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134740</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:44:49 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;fstream&gt;

enum Color {Red=0, Green=1, Blue=2};//...
</code></pre>
</blockquote>
<p>Werden Green und Blue nicht implizit weiter enumeriert?<br />
Und Red automatisch der Wert 0 zugewiesen, wenn kein anderer angegeben wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134743</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 13:47:04 GMT]]></title><description><![CDATA[<p>Also habe ich das jetzt richtig verstanden, dass ich den istream-Operator überladen soll, aber anstatt der ganzen if-Abfragen von Pi, eine Map dafür verwenden soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134744</guid><dc:creator><![CDATA[Blattasar]]></dc:creator><pubDate>Sun, 23 Oct 2011 13:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 14:16:55 GMT]]></title><description><![CDATA[<p>Blattasar schrieb:</p>
<blockquote>
<p>anstatt der ganzen if-Abfragen von Pi, eine Map dafür verwenden soll?</p>
</blockquote>
<p>Die if-Abfragen sind wohl schneller bei den drei Werten. Aber je mehr Farben Du hast, desto langsamer werden sie. Irgenwann wird die map schneller, die ist nämlich beinahe unabhängig von der Anzahl der Werte. Aber hier würde ich nicht auf Geschwindigkeit achten. map klingt mir erstmal umständlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134746</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Oct 2011 14:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 15:40:52 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Die if-Abfragen sind wohl schneller bei den drei Werten. Aber je mehr Farben Du hast, desto langsamer werden sie. Irgenwann wird die map schneller, die ist nämlich beinahe unabhängig von der Anzahl der Werte. Aber hier würde ich nicht auf Geschwindigkeit achten. map klingt mir erstmal umständlicher.</p>
</blockquote>
<p>Damit der Geschwindigkeitsunterschied gegenüber dem IO-Flaschenhals überhaupt mal auffällt, brauchst du schon einige verschiedene Farben. Aber was genau ist denn an der map umständlicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134790</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 23 Oct 2011 15:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 15:47:12 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Aber was genau ist denn an der map umständlicher?</p>
</blockquote>
<p>Nur das Initialisieren: Singleton oder lokale statische Variable und von einer Funktion füllen lassen, die diese map returnt und dabei pro Zugriff ein if bezahlen oder globale Variable vor der main() initialisieren lassen mit ebendieser Funktion und dann theoretisch die Initialisierungsreihenfolge globaler Objekte richtig steuern müssen. Aufwand, der es nicht wert ist, denke ich, weil man enum-Namen nicht in Dateien schreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134791</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Oct 2011 15:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 15:53:48 GMT]]></title><description><![CDATA[<p>Dass man enum-Namen nicht in Dateien schreibt, sehe ich auch so. Aber die map-Variante finde ich schöner als Copy&amp;Paste-if-Kaskaden (über switch könnte man reden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134795</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 23 Oct 2011 15:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 15:55:35 GMT]]></title><description><![CDATA[<p>switch geht aber nicht bei std::string. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134796</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 23 Oct 2011 15:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 15:59:43 GMT]]></title><description><![CDATA[<p>if ist hässlicher als map ist hässlicher als find.</p>
<p>Warum kein statisches char*-Array mit std::find?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134799</guid><dc:creator><![CDATA[vergleicher]]></dc:creator><pubDate>Sun, 23 Oct 2011 15:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:02:50 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Dass man enum-Namen nicht in Dateien schreibt, sehe ich auch so. Aber die map-Variante finde ich schöner als Copy&amp;Paste-if-Kaskaden (über switch könnte man reden).</p>
</blockquote>
<p>Aber perfektes hashing darf man auch nehmen.<br />
Ach, jetzt, wo ich auf Linux bin, gib's das ja als fertiges Paket. Mal installieren und ausprobieren…</p>
<pre><code>vhmain ~ # echo Red &gt; in.txt
vhmain ~ # echo Green &gt;&gt; in.txt
vhmain ~ # echo Blue &gt;&gt; in.txt
vhmain ~ # gperf in.txt
</code></pre>
<pre><code class="language-cpp">/* C code produced by gperf version 3.0.4 */
/* Command-line: gperf in.txt  */
/* Computed positions: -k'' */

#define TOTAL_KEYWORDS 3
#define MIN_WORD_LENGTH 3
#define MAX_WORD_LENGTH 5
#define MIN_HASH_VALUE 3
#define MAX_HASH_VALUE 5
/* maximum key range = 3, duplicates = 0 */

#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
/*ARGSUSED*/
static unsigned int
hash (str, len)
     register const char *str;
     register unsigned int len;
{
  return len;
}

#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char *
in_word_set (str, len)
     register const char *str;
     register unsigned int len;
{
  static const char * wordlist[] =
    {
      &quot;&quot;, &quot;&quot;, &quot;&quot;,
      &quot;Red&quot;,
      &quot;Blue&quot;,
      &quot;Green&quot;
    };

  if (len &lt;= MAX_WORD_LENGTH &amp;&amp; len &gt;= MIN_WORD_LENGTH)
    {
      register int key = hash (str, len);

      if (key &lt;= MAX_HASH_VALUE &amp;&amp; key &gt;= 0)
        {
          register const char *s = wordlist[key];

          if (*str == *s &amp;&amp; !strcmp (str + 1, s + 1))
            return s;
        }
    }
  return 0;
}
</code></pre>
<p>Naja, nicht schön, aber die Idee sollte klar werden. Ich hätte den Anfangsbuchstaben genommen. Die Länge ist aber auch süß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134801</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:28:04 GMT]]></title><description><![CDATA[<p>Darf man fragen wieso der Code in C ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134809</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:29:03 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Darf man fragen wieso der Code in C ist?</p>
</blockquote>
<p>Ja. Und Du kannst es sogar ganz alleine herausfinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134812</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:34:35 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Darf man fragen wieso der Code in C ist?</p>
</blockquote>
<p>Ja. Und Du kannst es sogar ganz alleine herausfinden.</p>
</blockquote>
<p>gperf, so so ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134815</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:47:00 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Darf man fragen wieso der Code in C ist?</p>
</blockquote>
<p>Ja. Und Du kannst es sogar ganz alleine herausfinden.</p>
</blockquote>
<p>Ich war unfähig es herauszufinden.</p>
<pre><code>% gperf -L C++ in.txt | xclip -o
</code></pre>
<p>Das kopiert bei mir folgenden Code in die Zwischenablage:</p>
<pre><code class="language-cpp">/* C++ code produced by gperf version 3.0.3 */
/* Command-line: gperf -L C++ in.txt  */
/* Computed positions: -k'' */

#define TOTAL_KEYWORDS 3
#define MIN_WORD_LENGTH 3
#define MAX_WORD_LENGTH 5
#define MIN_HASH_VALUE 3
#define MAX_HASH_VALUE 5
/* maximum key range = 3, duplicates = 0 */

class Perfect_Hash
{
private:
  static inline unsigned int hash (const char *str, unsigned int len);
public:
  static const char *in_word_set (const char *str, unsigned int len);
};

inline /*ARGSUSED*/
unsigned int
Perfect_Hash::hash (register const char *str, register unsigned int len)
{
  return len;
}

const char *
Perfect_Hash::in_word_set (register const char *str, register unsigned int len)
{
  static const char * wordlist[] =
    {
      &quot;&quot;, &quot;&quot;, &quot;&quot;,
      &quot;Red&quot;,
      &quot;Blue&quot;,
      &quot;Green&quot;
    };

  if (len &lt;= MAX_WORD_LENGTH &amp;&amp; len &gt;= MIN_WORD_LENGTH)
    {
      register int key = hash (str, len);

      if (key &lt;= MAX_HASH_VALUE &amp;&amp; key &gt;= 0)
        {
          register const char *s = wordlist[key];

          if (*str == *s &amp;&amp; !strcmp (str + 1, s + 1))
            return s;
        }
    }
  return 0;
}
</code></pre>
<p>Warum da inline steht, es aber nicht direkt inline geschrieben ist, kann ich zwar nicht verstehen, aber ich sehe, dass da C++ und nicht C/C++ (wie bei volkard) generiert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134821</guid><dc:creator><![CDATA[gutefrage]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Sun, 23 Oct 2011 16:48:34 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Dass man enum-Namen nicht in Dateien schreibt, sehe ich auch so. Aber die map-Variante finde ich schöner als Copy&amp;Paste-if-Kaskaden (über switch könnte man reden).</p>
</blockquote>
<p>Der Meinung bin ich auch, jedoch kann ich den Dateiinhalt leider nicht bestimmen. Ich habe jetzt die std::find Variante genommen, da sie schön schlank aussieht <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/2134822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134822</guid><dc:creator><![CDATA[Blattasar]]></dc:creator><pubDate>Sun, 23 Oct 2011 16:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to String zu enum on Mon, 24 Oct 2011 07:44:33 GMT]]></title><description><![CDATA[<p>gutefrage schrieb:</p>
<blockquote>
<p>Warum da inline steht, es aber nicht direkt inline geschrieben ist, kann ich zwar nicht verstehen, aber ich sehe, dass da C++ und nicht C/C++ (wie bei volkard) generiert wurde.</p>
</blockquote>
<p>Nö. Da wird immernoch C/C++ generiert - nur ein bisschen mehr Richtung C++ und nichtmehr ganz C-kompatibel. Macros sind mieser C++-Stil und register ist deprecated. Einmal &quot;class&quot; hinzuschreiben macht nicht wirklich C++ ohne &quot;C/&quot; draus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2134972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2134972</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Oct 2011 07:44:33 GMT</pubDate></item></channel></rss>