[c++] Probleme avec fstream...

 Probleme avec fstream... [c++] - Programmation

Marsh Posté le 03-04-2001 à 10:42:26    

Bonjour a tous,
 
Mon compilateur (GCC) ecrit par defaut les int sous forme ASCII dans les streams.
 
ex :
ofstream f("test.dat", ios::binary);
f << (int) 456;
 
et donc dans le fichier j'ai la chaine "456". Tout a fait normal. Seulement moi j'aimerais bien qu'il les stocke sous forme binaire, 4 octets par int, comme ca ca facilite la relecture.
 
J'ai donc ecrit la fonction suivante (censee surchargee la fonction existante) :
 
ostream& operator << (ostream& out, const int & i)
{
  out.write((char*) &i, sizeof(int));
  return out;
}
 
Qui est censee fonctionner. Mais bizarrement le compilo s'en fout et utilise la fonction standard, et continue a ecrire en ASCII dans le fichier. Ou est la connerie ? :sarcastic:

Reply

Marsh Posté le 03-04-2001 à 10:42:26   

Reply

Marsh Posté le 03-04-2001 à 12:35:48    

Please help !

Reply

Marsh Posté le 03-04-2001 à 14:56:38    

t'as essayé de faire par la suite un
f.setmode(filebuf::binary) ?
par la suite?
ptet que ça marche

Reply

Marsh Posté le 03-04-2001 à 15:13:39    

Un cast de (char *) sur un integer ? Ca ne marchera jamais ça.


---------------
"If you can walk away from a landing, it's a good landing. If you use the airplane the next day, it's an outstanding landing." - Chuck Yeager. | Chaîne YT | Photos
Reply

Marsh Posté le 03-04-2001 à 15:16:15    

ben faut bien forcer les choses non ? tu vois une autre maniere ??
 
janoscoder > MAILMOITONRIBSTP

Reply

Marsh Posté le 03-04-2001 à 16:25:30    

->toxin
en mode binary, typecaster un pointeur d'entier en pointeur d'octets marche. (et ce même avec des endians différents).

Reply

Marsh Posté le 27-08-2007 à 18:27:24    

Voilà une solution que j'utilise et qui marche au poil !
 
int A_Ecrire_dans_le_fichier;
char Sert_seulement_pour_L_adresse;
 
int main(int argc, char *argv[])
{
        A_Ecrire_dans_le_fichier=456;
        ofstream fichier;
        fichier.open ("test.dat", ios::binary);
        fichier.write (&Sert_seulement_pour_L_adresse - sizeof(A_Ecrire_dans_le_fichier), sizeof(A_Ecrire_dans_le_fichier));
        fichier.close ();
        return 0;
}
 
C'est tiré par les cheveux mais ça marche !

Reply

Marsh Posté le 28-08-2007 à 07:28:15    

dégueux
 

Code :
  1. [07:26:03][pts/5][/tmp][#7][&1] ? 1
  2. benoit@ibook >>> cat write.cpp
  3. #include <fstream>
  4. #include <cstring>
  5. int main()
  6. {
  7.   std::ofstream out("out", std::ios::binary);
  8.   int i = 456;
  9.   char buffer[sizeof i];
  10.   std::memcpy(buffer, &i, sizeof i);
  11.   out.write(buffer, sizeof i);
  12. }
  13. [07:27:24][pts/5][/tmp][#8][&1]
  14. benoit@ibook >>> g++ -Wall -std=c++98 write.cpp
  15. [07:27:30][pts/5][/tmp][#9][&1]
  16. benoit@ibook >>> ./a.out && hexdump -C out
  17. 00000000  00 00 01 c8                                       |....|
  18. 00000004

Reply

Marsh Posté le 28-08-2007 à 09:01:39    

on peut biensur faire directement avec un reinterpret_cast<char*>(&i);

Reply

Sujets relatifs:

Leave a Replay

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