nom de fichier variable? ofstream fich(var,ios::out),synthax macro?who

nom de fichier variable? ofstream fich(var,ios::out),synthax macro?who - C++ - Programmation

Marsh Posté le 28-10-2002 à 14:23:43    

je voudrai creer un objet de flux de la classe ofstream, mais pour plusieurs fichiers, donc j'ai opté pour l'ecriture svt:
 

Code :
  1. //les includes.......;
  2. #define RACINE "e:\\"
  3. #difine EXT ".dat"
  4. #define FICH RACINE##nom##EXT
  5. //instructions.......
  6. string nom;
  7. cin>>nom
  8. ofstream fichier(FICH,ios::out);
  9. //suite d'instructions.......


 
 
vous allez me dire que c'est logique
FICH est const hors qu'il doit etre un string ou un char*.
 
:

Code :
  1. //les includes.......;
  2. #define RACINE "e:\\"
  3. #difine EXT ".dat"
  4. #define FICH RACINE##nom##EXT
  5. //instructions.......
  6. string nom;
  7. cin>>nom
  8. string fic=(reinterpret_cast<char*>FICH)
  9. ofstream fichier(fic,ios::out);
  10. //suite d'instructions.......


 
et portant ça ne va pas.
aidez moi s'il vous plait.
merci bcp.
 

Reply

Marsh Posté le 28-10-2002 à 14:23:43   

Reply

Marsh Posté le 28-10-2002 à 14:28:56    

il faut metre FICH.c_str() je pense.

Code :
  1. ofstream fichier(FICH.c_str(),ios::out);

Reply

Marsh Posté le 28-10-2002 à 18:21:52    

tout simplement?
tu sais on me dit souvent que j'ai pas l'esprit objet.je peux dir qu'ils ont raison.
merci bcp.

Reply

Marsh Posté le 28-10-2002 à 18:40:11    

tu sais j'ai essayé , mais ça ne va pas.
quelqu'un pourrait m'aider??
merci

Reply

Marsh Posté le 29-10-2002 à 01:19:59    

Rappel: Le préprocesseur fait du traitement de texte sur le source avant compilation, et ne comprend rien au langage C ou C++.

Code :
  1. ofstream fichier(FICH,ios::out); //Ceci...
  2. 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 :
  1. #define FICH RACINE#nom#EXT
  2. ofstream fichier(FICH,ios::out); //Ceci...
  3. ofstream fichier("e:\\""nom"".dat",ios::out); //...devient ceci...
  4. ofstream fichier("e:\\nom.dat",ios::out); //...équivalent à ceci.

Ça marche pour des chaînes littérales, sans plus.
 
Correction simple:

Code :
  1. #define FICH RACINE+nom+EXT
  2. string nom;
  3. cin>>nom;
  4. ofstream fichier(FICH,ios::out); //Ceci...
  5. 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 :
  1. const string Racine= "e:\\";
  2. const string Extension= ".dat";
  3. string nom;
  4. cin>>nom
  5. string nomsys= Racine+nom+Extension;
  6. ofstream fichier(nomsys,ios::out);


Les amateurs de performance préfèrent comme ça:

Code :
  1. string nomsys(Racine);
  2. string nomsys+= nom;
  3. 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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 29-10-2002 à 09:24:18    

merci Musaran.
tu sais si je t'avais comme prof , je ne serais pas ici.
merci à tous.

Reply

Marsh Posté le 29-10-2002 à 11:43:48    

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 :
  1. ofstream fichier(FICH,ios::out); //Ceci...
  2. 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 :
  1. #define FICH RACINE#nom#EXT
  2. ofstream fichier(FICH,ios::out); //Ceci...
  3. ofstream fichier("e:\\""nom"".dat",ios::out); //...devient ceci...
  4. ofstream fichier("e:\\nom.dat",ios::out); //...équivalent à ceci.

Ça marche pour des chaînes littérales, sans plus.
 
Correction simple:

Code :
  1. #define FICH RACINE+nom+EXT
  2. string nom;
  3. cin>>nom;
  4. ofstream fichier(FICH,ios::out); //Ceci...
  5. 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 :
  1. const string Racine= "e:\\";
  2. const string Extension= ".dat";
  3. string nom;
  4. cin>>nom
  5. string nomsys= Racine+nom+Extension;
  6. ofstream fichier(nomsys,ios::out);


Les amateurs de performance préfèrent comme ça:

Code :
  1. string nomsys(Racine);
  2. string nomsys+= nom;
  3. 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.




 
 
tu sais, j'ai essayé ce que tu m'as conseillé mais il me rend l'erreur suivante.
 
 error C2664: '__thiscall std::basic_ofstream<char,struct std::char_traits<char> >::std::basic_ofstream<char,struct std::char_traits<char> >(const char *,int)' : cannot convert parameter 1 from 'class std
::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'
 
merci de me dir ce que c'est

Reply

Marsh Posté le 30-10-2002 à 00:50:16    

ca veut justement dire que lorsque tu veux ouvrir ton fichier avec  ofstream fichier(...), cette fonction prend en argument un const char* et non un string que tu lui propose.
Il faut donc faire ton_string.c_str() :D

Reply

Marsh Posté le 30-10-2002 à 01:05:41    

Je l'oublie toujours.
Désolé  :o


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 30-10-2002 à 14:23:46    

merci à tous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed