Musaran a écrit a écrit :
Rappel: Le préprocesseur fait du traitement de texte sur le source avant compilation, et ne comprend rien au langage C ou C++.Code :
- ofstream fichier(FICH,ios::out); //Ceci...
- ofstream fichier("e:\\"nom".dat",ios::out); //...devient ceci, qui n'est pas valide.
|
## sert à coller deux mots pour en former un troisième. Dans ce cas-ci, ce n'était pas possible, et cela aurait dû être une erreur.
# sert à transfomer en chaîne littérale: Code :
- #define FICH RACINE#nom#EXT
- ofstream fichier(FICH,ios::out); //Ceci...
- ofstream fichier("e:\\""nom"".dat",ios::out); //...devient ceci...
- ofstream fichier("e:\\nom.dat",ios::out); //...équivalent à ceci.
|
Ça marche pour des chaînes littérales, sans plus.
Correction simple: Code :
- #define FICH RACINE+nom+EXT
- string nom;
- cin>>nom;
- ofstream fichier(FICH,ios::out); //Ceci...
- ofstream fichier("e:\\"+nom+".dat",ios::out); //...devient ceci.
|
Ça marche, car "nom" se trouve être ici une std::string, qui surcharge l'opérateur + pour concaténer et générer une string temporaire.
Je ne saurais trop te conseiller de n'utiliser l'archaïque pré-processeur qu'en dernier recours: Code :
- const string Racine= "e:\\";
- const string Extension= ".dat";
- string nom;
- cin>>nom
- string nomsys= Racine+nom+Extension;
- ofstream fichier(nomsys,ios::out);
|
Les amateurs de performance préfèrent comme ça: Code :
- string nomsys(Racine);
- string nomsys+= nom;
- string nomsys+= Extension;
|
Ah oui... le "reinterpret_cast" est un truc sauvage, qui ordonne au compilateur d'obéir sans discuter.
C'est dangereux, car les messages du compilateur sont importants, il sait mieux que nous ce qui se passe (mal).
À n'utiliser que rarement, si l'on sait ce que l'on fait.
|