2010-08-02 7 views
18

Je souhaite exporter certaines données dans un fichier. Par exemple suppose que j'ai deux vecteurs de doubles:conversion d'un nom de variable en chaîne en C++

vector<double> data1(10); 
vector<double> data2(10); 

est-il un moyen facile de sortie à un fichier de sorte que la première ligne contient les rubriques de la data1 »et « données2 » suivi par le contenu réel. La fonction qui sort les données sera passée de différents tableaux si dur codant le nom de l'en-tête n'est pas possible - idéalement, je voudrais convertir le nom de variable en une chaîne, puis sortie cette chaîne suivie par le contenu de la tableau de vecteur. Cependant, je ne suis pas sûr comment convertir le nom de variable 'data1' en une chaîne, ou en effet si cela peut facilement être fait (à la lecture des forums, je suppose qu'il ne peut pas) Si cela n'est pas possible une alternative pourrait être d'utiliser un conteneur associatif tel qu'une carte ou peut-être plus simplement un conteneur 'paire'.

pair<vector<double>,string> data1(10,'data1'); 

Toutes les suggestions seraient les bienvenues!

+0

Je me demande ce que vous essayez d'atteindre. S'il s'agit de quantités arbitraires de données, nommer chacune de ses parties ne vous servira à rien, car il faut quand même le faire à la main. Votre deuxième solution est probablement celle que vous recherchez. – data

+0

connexes http://stackoverflow.com/questions/201593/-there-a-simple-way-to-convert-c-enum-to-string –

Répondre

30

Vous pouvez utiliser le préprocesseur "stringify" # faire ce que vous voulez:

#include <stdio.h> 

#define PRINTER(name) printer(#name, (name)) 

void printer(char *name, int value) { 
    printf("name: %s\tvalue: %d\n", name, value); 
} 

int main (int argc, char* argv[]) { 
    int foo = 0; 
    int bar = 1; 

    PRINTER(foo); 
    PRINTER(bar); 

    return 0; 
} 


name: foo value: 0 
name: bar value: 1 

(Désolé pour printf, je ne ai jamais eu le coup de <iostream> Mais cela devrait être suffisant..)

+2

cela pourrait aider -> http://gcc.gnu.org/onlinedocs/cpp/Stringification.html – KedarX

2

Vous pouvez utiliser le préprocesseur, il existe un jeton stringify, mais il n'est disponible que depuis la source, pas avec une fonction (vous obtiendrez le nom de l'argument).

1

J'aurais pensé que la réponse évidente est de faire en sorte que la fonction qui exécute la sortie prenne le texte d'en-tête en tant que paramètre de chaîne.

+0

Idéalement, je voudrais pouvoir appeler la fonction qui fait la sortie sans un paramètre de chaîne contenant les noms des varialbes . – Wawel100

+0

@ Wawel100: Impossible. – Puppy

-3

Wow, c'est un peu trickey, une chose que vous pourriez faire est de créer des classes ou des structures, qui ont un élément qui est la chaîne 'name'.

1

légèrement adapté de @ réponse de sarnold, C++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl; 

Un exemple de programme qui utilise:

int main() { 
    int foo = 1; 
    DEBUG(foo); 

    return 0; 
} 
0

J'ai eu le même problème. Après un peu d'expérimentation, j'ai créé les macros suivantes qui convertissent les noms de variables, champs, fonctions, méthodes et types en chaînes.

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable) 

#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function) 

#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method) 

#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type) 

Le code utilise opérateur virgule et conversion vide pour forcer le compilateur à vérifier si la variable, fonction, etc. existe vraiment. La bonne chose est que cela fonctionne bien avec les variables non initialisées aussi. Je l'ai testé sur VC et GCC avec toutes les options pédantes que j'ai trouvées sans aucun message d'avertissement.

int GetAndPrintValue(const char* VariableName) 
{ 
    std::cout << VariableName << std::endl; 
    return 10; 
} 

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable)); 

J'utilise un code tel que j'écris parseurs qui lit les données du flux d'entrée et si la variable parser est hors des limites, il lance une exception avec le nom de la variable qui a échoué mes contrôles de validité.

4

essayez ceci:

#define GET_VARIABLE_NAME(Variable) (#Variable) 

// dans les fonctions

int var=0;  
char* var_name= GET_VARIABLE_NAME(var); 
0

Pour ce cas, je l'ai fait nameof() macro. Il renvoie un nom std :: string d'une variable, d'un type ou d'un membre. Cela fonctionne comme nameof() en C#.

Par exemple:

#include "nameof.h" 

std::vector<double> data1(10); 
std::string name = nameof(data1); // "data1" 

struct Foo1 
{ 
    struct Foo2 
    { 
     Foo1* foo1; 
    }; 

    Foo1* foo1; 
    Foo2 foo2; 
}; 

name = nameof(Foo1::foo1->foo2.foo1); // "foo1" 

name = nameof(123); // std::logic_error exception