2017-10-15 11 views
-1

j'ai un fichier appelé definitions.h comme ceci:Est-il possible de lire les constantes à partir du fichier en C?

#define PACKAGE 270 
#define IMPORT 271 
#define COMILLAS 272 
#define FUNCION 273 
... 

Et j'ai un fichier texte avec les informations suivante:

PACKAGE package 
IMPORT import 
COMILLAS " 
FUNCION func 

Est-il possible de lire le second fichier d'une manière me permet de charger dans deux tableaux la constante elle-même et les mots minuscules? Dans un tableau ce serait PACKAGE, IMPORT avec sa valeur définie associée et dans la seconde les mots minuscules (package, import, ", func)

J'ai essayé de lire les mots majuscules comme des chaînes mais je ne sais pas comment les changer à une constante.

Nous vous remercions à l'avance.

+0

La question n'est pas claire. Peux-tu élaborer? Voulez-vous lire les 2 fichiers pour créer des tableaux avec leur contenu? Cela impliquerait seulement la lecture du fichier et l'assignation des éléments au tableau. –

+1

Vous voulez que cela se produise au moment de la compilation ou? – Gnqz

+0

Ce dont j'ai besoin est de lire seulement le deuxième fichier. Le truc c'est que je veux que les majuscules (PACKAGE, IMPORT ..) soient les constantes définies dans le premier fichier, pas les chaînes. Par exemple, je veux stocker PACKAGE (la valeur définie associée à 270) et pas "PACKAGE" (la chaîne qui se trouve dans le fichier). @J ... S – Daniel

Répondre

1

pour ce faire, votre programme doit contenir une valeur de chaîne pour chaque nom que vous voulez traduire. pas seulement des macros qui se convertissent à leurs valeurs tôt dans la compilation, ne laissant aucune trace du nom que vous avez utilisé là-bas

Donc vous auriez besoin d'un fichier, disons defin itions.c, contenant quelque chose comme:

struct TokenNameEntry { 
    int value; 
    const char* name; 
}; 

const struct TokenNameEntry tokens[] = { 
    { PACKAGE, "PACKAGE" }, 
    { IMPORT, "IMPORT" }, 
    { COMILLAS, "COMILLAS" }, 
    { FUNCION, "FUNCION" }, 
    // ... 
}; 

Mais qu'en est-il de ne pas vous répéter? Maintenant, si vous ajoutez ou supprimez des constantes, vous devez mettre à jour définitions.h et definitions.c.

Pour améliorer cela, j'aime utiliser un "fichier de macros". Cela ne contient que des utilisations répétées d'une ou de plusieurs macros, de sorte que d'autres fichiers peuvent définir les macros et faire en sorte que ce fichier dise diverses choses à propos des données qu'il contient. Appelons ce fichier definitions_macros.h:

/* definitions_macros.h 
* NO INCLUDE GUARD: A file may redefine the macros and include 
* more than once. */ 
DEFINE_TOKEN(PACKAGE, 270) 
DEFINE_TOKEN(IMPORT, 271) 
DEFINE_TOKEN(COMILLAS, 272) 
DEFINE_TOKEN(FUNCION, 273) 
// ... 

Alors definitions.h changerait à ressembler à quelque chose comme:

#ifndef CONST_DEFINITIONS_H_ 
#define CONST_DEFINITIONS_H_ 

#define DEFINE_TOKEN(symbol, value) symbol = value, 
typedef enum { 
#include "definitions_macros.h" 
} TokenType; 
#undef DEFINE_TOKEN 

const char* token_to_name(TokenType tok); 
TokenType token_from_name(const char* name); 

#endif 

Et definitions.c devient:

#include "definitions.h" 

struct TokenNameEntry { 
    TokenType value; 
    const char* name; 
}; 

#define STRINGIFY_NOEXPAND(x) #x 
#define STRINGIFY(x) STRINGIFY_NOEXPAND(x) 
#define DEFINE_TOKEN(symbol, value) { symbol, STRINGIFY(symbol) }, 
const struct TokenNameEntry tokens[] = { 
#include "definitions_macros.h" 
}; 
#undef DEFINE_TOKEN 
const unsigned int num_tokens = sizeof(tokens)/sizeof(tokens[0]); 

const char* token_to_name(TokenType tok) { 
    // TODO! 
} 

TokenType token_from_name(const char* name) { 
    // TODO! 
} 

Et maintenant, vous avez un moyen d'obtenir à partir d'une chaîne que vous lisez d'une ligne dans le fichier à la valeur numérique que vous souhaitez stocker pour le représenter. Vous pouvez facilement modifier la liste ou les valeurs de ces jetons constants en un seul endroit. Si quelque chose d'autre doit faire quelque chose de fortement structuré avec toutes ces valeurs (peut-être une instruction switch?), Vous pouvez réutiliser le même fichier de macros. Si vous souhaitez associer plus de données à ces constantes, vous pouvez ajouter plus d'arguments à la macro DEFINE_TOKEN.