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.
 
 
 
   |