2009-10-25 9 views
2

J'ai un fichier avec des valeurs comme: START et STOP. J'ai aussi l'ENUM suivante a déclaré:Comment affecter une valeur à une énumération en fonction de l'entrée d'un fichier en C++?

enum Type { 
    START, 
    STOP 
}; 

Je suis en train de régler la ENUM égale à la première valeur dans le fichier avec quelque chose comme ceci:

enum Type foo; 

ifstream ifile; 
ifile.open("input.txt"); 

ifile >> foo; 

Je reçois l'erreur: aucune correspondance pour 'operator >>' dans 'ifile >> foo'.

Comment procéder correctement?

Répondre

1

J'ai trouvé pour ma situation particulière que le code suivant est la meilleure solution:

template <class T> T a2e(string c, const string a[], const int size) { 
    for (int i=0; i < size; i++) { 
     if (c == a[i]) { 
      return static_cast<T>(i); 
     } 
    } 
} 

Et serait utilisé comme suit:

enum StateType {START, STOP}; 
const int MAXVALUES = STOP+1; 
const string stateNames[MAXVALUES] = {"START", "STOP"}; 

enum StateType state; 

ifstream ifile; 
ifile.open("input.txt"); 

ifile >> foo; 
state = a2e <enum StateType> (foo, stateNames, MAXVALUES); 

J'espère que cela aidera quelqu'un dans le futur. Merci à tous ceux qui ont fait des suggestions sur la façon de résoudre ce problème.

+0

Juste une note sur le style: Je préférerais mettre un NUMBER_OF_STATETYPES à la fin de plutôt que de déclarer une variable distincte, sans lien syntaxique. Dans le cas où plus d'états sont ajoutés plus tard, il est moins probable que le nombre de valeurs enum ne soit pas mis à jour. – foraidt

4

La chose la plus rapide à faire est de lire dans un int et de le lancer dans votre Type enum.

+0

Je n'ai pas de contrôle sur les fichiers d'entrée, donc je dois être capable de tout faire sur le code. – blcArmadillo

+0

C'est ce que je dis. int i; ifile >> i; foo = (Type) i; – popester

+0

Humm ... J'ai essayé d'écrire un programme simple pour tester ce que vous dites et ça n'a pas l'air de marcher. J'ai posté des détails comme une "réponse" à cette question. Si vous pouviez vérifier, je l'apprécierais vraiment. Merci. – blcArmadillo

0

@popester

je poste cela comme une réponse, mais à partir du code d'expérience ne se traduit pas trop dans les réponses de poste sur le SO.

Je viens d'écrire le programme court suivant pour tester ce que vous suggérez:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 
    enum Type { 
     START, 
     STOP 
    }; 

    int bar; 
    enum Type foo; 

    ifstream ifile; 
    ifile.open("input.txt"); 

    ifile >> bar; 

    foo = (Type) bar; 
    cout << "bar: " << bar << endl; 

    cout << "foo: " << foo << endl; 
} 

Ci-dessous est mon fichier input.txt:

STOP

Je Compilé et exécuté le programme et la sortie du suivant:

bar: -1207974988
foo: -1207974988

Suis-je juste mal compris ce que vous suggérez? Si vous pouviez me diriger dans la bonne direction, ce serait formidable. Merci de votre aide.

+0

Je suis désolé, j'ai mal compris la représentation du fichier. J'ai supposé que le fichier avait '1' ou '0' comme contenu, pas la chaîne. C/C++ n'a pas une bonne réponse pour ce que vous essayez de faire, sauf pour maintenir manuellement une représentation constante de la chaîne. Si vous pouvez vous en passer avec l'utilisation de CLR/C++, vous pouvez faire l'analyse syntaxique enum, mais C++ n'a pas de support natif pour analyser les énumérations en fonction du nom de la valeur. – popester

1

L'opérateur d'insertion de flux n'est pas surchargé pour les types définis par l'utilisateur. Vous pouvez en définir un pour votre objet enum de type Type ou utiliser l'une des surcharges existantes pour lire unsigned char ou bool, puis modifier la valeur de votre enum.

1

http://condensedcpp.com/Enums.html

std::istream& operator >> (std::istream& i, Season& season) 
{ 
    season = SPRING; 
    std::string value; 
    if (i >> value) { 
     if (value == "Summer") { 
      season = SUMMER; 
     } 
     else if (value == "Autumn") { 
      season = AUTUMN; 
     } 
     else if (value == "Winter") { 
      season = WINTER; 
     } 
    } 
    return i; 
} 
Questions connexes