ouvrir fichier texte en binaire, réinventage de roue???

ouvrir fichier texte en binaire, réinventage de roue??? - C++ - Programmation

Marsh Posté le 19-11-2003 à 11:27:01    

lu tous et toutes!
 
voila mon pb:
j'ai un fichier texte, avec par ex écrit dedans "je suis le roi des cons"
 
je désirerais ouvrir ce fichier et stocker le tout dans un flux, mais sous forme binaire  
pour cela j'ai créé une fonction qui lit le fichier txt caractere par caractere, envoie ce char à ma fonction CharToBinary ci-dessous:
 

Code :
  1. std::string CharToBinary(char c)    // encode un caractere ASCII en binaire sur 8bits
  2. {
  3.   int cpt = 0;            //compte le nb de bit
  4.   int dividende = int(c);//  caractere ascii a coder en binaire;
  5.   int reste;          // dividende%2
  6.   int resultat;       // dividende/2
  7.   std::string s, s2;
  8.   std::stringstream sstr;
  9.   while(dividende >= 2)
  10.     {
  11.       cpt++;
  12.       reste = dividende%2;
  13.       resultat = dividende/2;
  14.       dividende = resultat;
  15.       sstr<<reste;
  16.     }
  17.   reste = dividende%2;    // on effectue la derniere etape de la division
  18.   sstr<<reste;
  19.   s = sstr.str();     // convertion du flux en string
  20.   for (int i = cpt+1; i<8; i++)       //on complete le nombre sur 8bits avec des 0
  21.     {
  22.       s.insert(s.size(), 1, '0');
  23.     }
  24.   for (int i = 7; i>=0; i--)     //on met le palindrome de s dans s2
  25.     {
  26.       s2.insert(s2.size(), 1, s[i]);
  27.     }
  28.   return s2;
  29. }


 
donc on prend la valeur ASCII du char et on transforme ça en binaire...
 
 
est-ce que je réinvente la roue là??? :??: :pt1cable:  
pcq j'ai vu dans les options d'ouverture de fichier ça:

Code :
  1. ifstream ifstr("fichier.txt", ios::binary);


et ce ios::binary, que je le mette ou non, ça ne change rien quan j'affiche le contenu.
 
 
thx
++


Message édité par Riot le 19-11-2003 à 11:27:45
Reply

Marsh Posté le 19-11-2003 à 11:27:01   

Reply

Marsh Posté le 19-11-2003 à 11:29:10    

heuh nan rien a voir

Reply

Marsh Posté le 19-11-2003 à 11:34:34    

plus compliqué ta méthode tu meurs. ya de ça un an, on avait eu une grappée de sujets là dessus, y en a un ou on faisait le tour de tout ce qui existe
 
note pour plus tard
un char est codé sur CHAR_BIT

Reply

Marsh Posté le 19-11-2003 à 11:38:17    

Code :
  1. while(dividende >= 2)
  2. {
  3. ...
  4. }
  5. reste = dividende%2;


 
 
fodra m'expliquer l'interet du modulo :O

Reply

Marsh Posté le 19-11-2003 à 15:13:46    

quand je sors du while, il me manque une étape de division... stou.

Reply

Marsh Posté le 19-11-2003 à 15:15:16    

quand tu sors du while divide est inferieur a 2 (vu que ta condition c'est dividende >=2), et superieur ou egal a 0
soit : 0,1
 
Fair un modulo la dessus me parait, comment dire, superflu ?
 

Reply

Marsh Posté le 19-11-2003 à 15:55:13    

chrisbk>hey! g réfléchi (et surtout reposé une div...)
et en fait ta raison... :whistle:  
en effet, il suffit de recuperer dividende/2 (resultat) de la derniere etape
donc je zappe  

Code :
  1. reste = dividende%2


 
j ete remercie et je m'incline! :jap:  
 
Taz> je note.

Reply

Marsh Posté le 19-11-2003 à 15:58:40    

cela dit tu as une maniere affreusement complexe de faire ton affaire
 

Code :
  1. std::string CharToBinary(char c)   
  2. {
  3. std::string res;
  4. for (int i=7;i>=0;i--)
  5. {
  6. if (c&(1<<i)==0)
  7. res+='0';
  8. else
  9. res+='1';
  10. }
  11. return res;
  12. }

Reply

Marsh Posté le 19-11-2003 à 16:04:33    

peut-etre que l'idee est bonne seulement ton code marche pas... il me sort '11111111' pour n'importe quel char...
(desolé je comprend pas (encore...) ton code)
thx

Reply

Marsh Posté le 19-11-2003 à 16:05:52    

CHAR_BIT :o
 
res += '0' + (c&(1<<i))
 
:o
 
now la meme chose en template pour dérouler tout ça :D

Reply

Marsh Posté le 19-11-2003 à 16:05:52   

Reply

Marsh Posté le 19-11-2003 à 16:08:52    

pb de parenthese sur la condition
if ((c&(1<<i))==0)  

Reply

Marsh Posté le 19-11-2003 à 16:19:18    

Code :
  1. std::string CharToBinary(char c)   
  2.   { 
  3.     std::string res;
  4.     for (int i=7;i>=0;i--)
  5.     {
  6.       if ((c&(1<<i))==0)
  7.         res+='0';
  8.       else
  9.         res+='1';
  10.     }
  11.     return res;
  12.   }


 
faut juste des parentheses dans le if.
merci encore.
 
edit: lol g ete grillai!!!!


Message édité par Riot le 19-11-2003 à 16:20:10
Reply

Marsh Posté le 19-11-2003 à 16:20:45    

Taz a écrit :


res += '0' + (c&(1<<i))


heuh ?

Reply

Marsh Posté le 19-11-2003 à 17:31:00    

ah ouais en fait j'avais pas vu ou étais ton décalage
 
cela dit
 
res += '0' + (c&(1<<i) != 0)
 
doit marcher ....


Message édité par Taz le 19-11-2003 à 17:33:02
Reply

Marsh Posté le 27-11-2003 à 20:25:06    

Taz a écrit :

now la meme chose en template pour dérouler tout ça :D


 
j'essaie :  
 

Code :
  1. template<typename T>
  2. std::string ToBinary(const T & var)
  3. {
  4.   std::string res;
  5.   for(int i=sizeof(T)*8-1; i>=0; i--)
  6.     res += ( (c & (1<<i)) ? '1' : '0' );
  7.   return res;
  8. }


 
voila ... ne me tapez pas si c'est pas ca ... expliquez moi plutot :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-11-2003 à 20:26:35    

je v ptet me faire taper a cause du sizeof mais g tjs pas bien compris l'article sur la taille d'un tableau :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-11-2003 à 22:47:58    

for(int i=sizeof(T)*8-1;
 
:o
 
sizeof(T) * CHAR_BIT
 
:o

Reply

Marsh Posté le 27-11-2003 à 23:17:06    

Taz a écrit :

for(int i=sizeof(T)*8-1;
 
:o
 
sizeof(T) * CHAR_BIT
 
:o


 
c'est bien, tu t'énerves moins facilement que par la passé, il y a du progrès  [:calin]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 27-11-2003 à 23:27:46    

alalala et mon post sur la MPT alros :
 

Code :
  1. template<int ITER>
  2. std::string CharToBinary(char c)     
  3.    std::string res;
  4.    if(c&(1<<ITER))
  5.    { 
  6.      res+='1';
  7.    }
  8.    else
  9.    { 
  10.      res+='0';
  11.    }
  12.    res + =CharToBinary<ITER-1>( c );
  13.    return res;
  14. }
  15. template<>
  16. std::string CharToBinary<0>(char c)     
  17.    std::string res;
  18.    if(c&1)
  19.    { 
  20.      res+='1';
  21.    }
  22.    else
  23.    { 
  24.      res+='0';
  25.    }
  26.    return res;
  27. }

Reply

Marsh Posté le 27-11-2003 à 23:41:32    

tu ferais bien d'inliner et de faire
 
res+='0' + (c&1);

Reply

Marsh Posté le 28-11-2003 à 10:30:20    

Une petite question sur la solution de JoelF :  
 
std::string res ne va pas etre copié ITER fois ?
 
car si on decompose, par exemple sur ITER=4, on devrait avoir :
(avec l'inline)

Code :
  1. std::string res1; 
  2. if(c&(1<<4)) 
  3. {   
  4.   res1+='1'; 
  5. }
  6. else 
  7. {   
  8.   res1+='0'; 
  9. }
  10. // 2eme appel :
  11. {
  12.   std::string res2;
  13.   if(c&(1<<3)) 
  14.   {   
  15.     res2+='1'; 
  16.   }
  17.   else 
  18.   {   
  19.     res2+='0'; 
  20.   }
  21.   //3eme appel
  22.   {
  23.     std::string res3;
  24.     if(c&(1<<2)) 
  25.     {   
  26.       res3+='1'; 
  27.     }
  28.     else 
  29.     {   
  30.       res3+='0'; 
  31.     }
  32.     //4eme appel
  33.     {
  34.       std::string res4; 
  35.       if(c&1) 
  36.       {   
  37.         res4+='1'; 
  38.       }
  39.       else 
  40.       {   
  41.         res4+='0'; 
  42.       }
  43.     }
  44.     res3 += res4; // on copie la valeur de retour a l'appel
  45.   }
  46.   res2 += res3;
  47. }
  48. res1 += res2;


 
en gros, a chaque itération, d'apres ce que j'ai compris, la chaine de retour serait copiée.
 
merci de m'expliquer si je me trompe :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-11-2003 à 20:07:15    

si les fontcions sont déclarées inline et que le compilo ets bon, il va aliaser les recopie et générer une seule recopie.

Reply

Marsh Posté le 01-12-2003 à 13:27:33    

ah bien, ok :) (je savais pas qu'un compilo pouvait optimiser a ce point :) )


---------------
-( BlackGoddess )-
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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