[C++] ecrire dans un fichier non formatté avec stl

ecrire dans un fichier non formatté avec stl [C++] - C++ - Programmation

Marsh Posté le 31-07-2003 à 14:37:41    

salut,
 
ben j'ai essaye avec un ofstream avec le flag ios::binary , mais il m'écrit quand meme tout en formatte ...
 
je suis paume là ... une petite indication ?
 
merci

Reply

Marsh Posté le 31-07-2003 à 14:37:41   

Reply

Marsh Posté le 31-07-2003 à 14:39:11    

un exemple de code

Reply

Marsh Posté le 31-07-2003 à 14:39:34    

T'as un bout de code?
 
[:benou_grilled]


Message édité par LetoII le 31-07-2003 à 14:40:43

---------------
Le Tyran
Reply

Marsh Posté le 31-07-2003 à 14:40:02    

Code :
  1. void writeToFile(string filename)
  2. {
  3.  ofstream pf(filename.c_str(),ios::binary | ios::out | ios::trunc);
  4.  list<HiScore>::const_iterator iter;
  5.  
  6.  for (iter=wHiScoreList.begin(); iter != wHiScoreList.end(); iter++)
  7.  {
  8.   pf << *iter << endl;
  9.  }
  10. }


Message édité par fucky_fuck le 31-07-2003 à 14:41:10
Reply

Marsh Posté le 31-07-2003 à 14:40:58    

ça marchera jamais ton truc. les seuls chose qu'on peut ecrire en C++ c'est des types de bases

Reply

Marsh Posté le 31-07-2003 à 14:41:54    

ben oui mais j'ai surchargé le << de hiscore ...
 

Code :
  1. ostream & operator << (ostream & os,const HiScore & hi)
  2. {
  3. return os << hi.getName() << "  " << hi.getScore();
  4. }

Reply

Marsh Posté le 31-07-2003 à 14:42:38    

là il m'écrit :
 
 
alex  12
rene  62
robert  123
jm  20000

Reply

Marsh Posté le 31-07-2003 à 14:43:05    

mais moi, je veux la même chose en non formatté, pour pas qu'on puisse bidouiller trop facilement ...

Reply

Marsh Posté le 31-07-2003 à 14:43:53    

t'as sur chargé op<< ?

Reply

Marsh Posté le 31-07-2003 à 14:44:23    

On pourrait avoir les proto des méthodes getName et getScore?


---------------
Le Tyran
Reply

Marsh Posté le 31-07-2003 à 14:44:23   

Reply

Marsh Posté le 31-07-2003 à 14:44:58    

enfin pas surcharger, mais je l'ai defini quoi ...
comme ça je peut faire cout << unHIscore ...

Reply

Marsh Posté le 31-07-2003 à 14:45:26    

string getName () const  {return wName;}
unsigned int getScore () const  {return wScore;}

Reply

Marsh Posté le 31-07-2003 à 14:45:49    

bon ben c'est pas la méthode alors... quelqu'un lui explique

Reply

Marsh Posté le 31-07-2003 à 14:45:54    

LetoII a écrit :

On pourrait avoir les proto des méthodes getName et getScore?


[:benou_+1]
Il est plein de trous le code donné... :(

Reply

Marsh Posté le 31-07-2003 à 14:46:15    

ce serait cool ...

Reply

Marsh Posté le 31-07-2003 à 14:47:17    

si tu as des E/S textesx avec les << >> et ça ne change quasiment rien de mettre ton fichier en binaire, voir rien du tout selon ton système

Reply

Marsh Posté le 31-07-2003 à 14:48:23    

ouais ça j'ai bien vu, mais alors, je fais coment pour écrire dans le fichier en mode non formatté ?
 
il faut pas que je me serve des << >> ?

Reply

Marsh Posté le 31-07-2003 à 14:49:27    

normalement, je me sert de open, et fopen ...
et la c un open que je veux faire ...

Reply

Marsh Posté le 31-07-2003 à 14:50:18    

ben vu que tu as du texte essentiellement, trouves toi un système de cryptage, genre des XOR. apres fo faire des write(reinterpret_cast<char*>(&un_type_de_base), sizeof un_type_de_base) (sauf pour les char* evidemment)

Reply

Marsh Posté le 31-07-2003 à 14:51:16    

ouais mais ça c si je me sert de open ...
mais avec la STL y 'a pas un moyen simple ?

Reply

Marsh Posté le 31-07-2003 à 14:52:29    

genre si tu voulais ecrire les coordonnées d'un monde 3d, tu l'écrirais pas en mode texte ... tu ferais comment avec la STL ?

Reply

Marsh Posté le 31-07-2003 à 14:52:48    

Transtype tes chaines en tableaux de flottants et sauve le comme ca  
 
 
 
 
 
 
<je sors>

Reply

Marsh Posté le 31-07-2003 à 15:10:34    

nan mais meme si je ferais pas comme ça, je voudrais bien savoir comment on fait !
 
je suis curieux !  
 

Reply

Marsh Posté le 31-07-2003 à 15:21:32    

faut utiliser un flux binaire (ios::binary je crois) et zou c fini.

Reply

Marsh Posté le 31-07-2003 à 15:45:10    


finalement, j'ai fait comme ça :
 

Code :
  1. void writeToFile(string filename)
  2. {
  3. int pf = open(filename.c_str(),_O_WRONLY | _O_CREAT | _O_BINARY |_O_TRUNC);
  4. list<HiScore>::const_iterator iter;
  5. unsigned int length,score;
  6. for (iter=wHiScoreList.begin(); iter != wHiScoreList.end(); iter++)
  7. {
  8. // Taille du nom
  9. length=(*iter).getName().length()+1;
  10. write(pf,&length,sizeof(unsigned int));
  11. // Nom
  12. write(pf,(*iter).getName().c_str(),length);
  13. //Score
  14. score=(*iter).getScore();
  15. write(pf,&score,sizeof(unsigned int));
  16. }
  17. close(pf);
  18. }


 
je rajoute un petit codage cesar et c parti ...
 
ouais mais attends, j'ai déjà essayer (debut du message), et il m'écriver tout en formatter...


Message édité par fucky_fuck le 31-07-2003 à 15:47:12
Reply

Marsh Posté le 31-07-2003 à 15:47:57    

le ios::binary je crois que ça veux juste dire qu'il t'ecrit pas les CR/LF quand tu as un \n ...

Reply

Marsh Posté le 31-07-2003 à 15:48:45    

:non: c pe pas celui la mais y a un truc pour dire que ton flux est un flux binaire  
 
Google est ton ami  :sarcastic:

Reply

Marsh Posté le 31-07-2003 à 15:55:12    

l'horreur ! tu sait que les ostream ont une méthode write. ça sera portable, bufferisé et bien plus propre. tu devrais pouvoir faire la modif rapidos


Message édité par Taz le 31-07-2003 à 15:59:53
Reply

Marsh Posté le 31-07-2003 à 16:11:26    

Code :
  1. void writeToFile(const string filename)  const
  2.   {
  3.     ostream of(filename.c_str(), ios::binary);
  4.     for (list<HiScore>::const_iterator iter=wHiScoreList.begin();
  5.  iter != wHiScoreList.end();
  6.  ++iter)
  7.     {
  8.       const string &s(iter->getName());
  9.       of.write(reinterpret_cast<const char *>(&s.size()),
  10.        sizeof s.size());
  11.       of.write(s.data(),
  12.        s.length());
  13.       of.write(reinterpret_cast<const char *>(iter->getScore()),
  14.        sizeof iter->getScore());
  15.     }
  16.   }


 
me parait mieux (j'ai pas compilé, mais à priori c'est correct

Reply

Marsh Posté le 31-07-2003 à 21:12:25    

autant s'écrire un petit manipulateur pour une class Foo par exemple (on peut tres bien mettre un relation d'héritage là.
 
 
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. struct Foo{};
  4. class FooBinaryWriter
  5. {
  6. public:
  7.   explicit FooBinaryWriter(const Foo &f):
  8.     foo(f)
  9.   {}
  10.   inline ostream & operator()(ostream &os) const
  11.   {
  12.     os <<  " *** j\'ecris *** ";
  13.     // et des trucs binaires avec os.write
  14.     // cette classe peut être amie de Foo
  15.     return os;
  16.   }
  17. private:
  18.   const Foo &foo;
  19. };
  20. ostream& operator<<(ostream &os, const FooBinaryWriter &fbw)
  21. {
  22.   return fbw(os);
  23. }
  24. inline FooBinaryWriter FBW(const Foo &f)
  25. {
  26.   return FooBinaryWriter(f);
  27. }
  28. int main()
  29. {
  30.   Foo f;
  31.   cout << "Hello" << FBW(f) << "world" << endl;
  32. }

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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