Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1165 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°570551
Riot
Buy me a riot
Posté le 19-11-2003 à 11:27:01  profilanswer
 

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
mood
Publicité
Posté le 19-11-2003 à 11:27:01  profilanswer
 

n°570552
chrisbk
-
Posté le 19-11-2003 à 11:29:10  profilanswer
 

heuh nan rien a voir

n°570560
Taz
bisounours-codeur
Posté le 19-11-2003 à 11:34:34  profilanswer
 

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

n°570564
chrisbk
-
Posté le 19-11-2003 à 11:38:17  profilanswer
 

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


 
 
fodra m'expliquer l'interet du modulo :O

n°570774
Riot
Buy me a riot
Posté le 19-11-2003 à 15:13:46  profilanswer
 

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

n°570777
chrisbk
-
Posté le 19-11-2003 à 15:15:16  profilanswer
 

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 ?
 

n°570819
Riot
Buy me a riot
Posté le 19-11-2003 à 15:55:13  profilanswer
 

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.

n°570824
chrisbk
-
Posté le 19-11-2003 à 15:58:40  profilanswer
 

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

n°570836
Riot
Buy me a riot
Posté le 19-11-2003 à 16:04:33  profilanswer
 

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

n°570840
Taz
bisounours-codeur
Posté le 19-11-2003 à 16:05:52  profilanswer
 

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

mood
Publicité
Posté le 19-11-2003 à 16:05:52  profilanswer
 

n°570844
chrisbk
-
Posté le 19-11-2003 à 16:08:52  profilanswer
 

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

n°570855
Riot
Buy me a riot
Posté le 19-11-2003 à 16:19:18  profilanswer
 

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
n°570857
chrisbk
-
Posté le 19-11-2003 à 16:20:45  profilanswer
 

Taz a écrit :


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


heuh ?

n°570937
Taz
bisounours-codeur
Posté le 19-11-2003 à 17:31:00  profilanswer
 

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
n°577780
blackgodde​ss
vive le troll !
Posté le 27-11-2003 à 20:25:06  profilanswer
 

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 )-
n°577782
blackgodde​ss
vive le troll !
Posté le 27-11-2003 à 20:26:35  profilanswer
 

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 )-
n°577898
Taz
bisounours-codeur
Posté le 27-11-2003 à 22:47:58  profilanswer
 

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

n°577919
schnapsman​n
Zaford Beeblefect
Posté le 27-11-2003 à 23:17:06  profilanswer
 

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!"
n°577930
Joel F
Real men use unique_ptr
Posté le 27-11-2003 à 23:27:46  profilanswer
 

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

n°577933
Taz
bisounours-codeur
Posté le 27-11-2003 à 23:41:32  profilanswer
 

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

n°578079
blackgodde​ss
vive le troll !
Posté le 28-11-2003 à 10:30:20  profilanswer
 

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 )-
n°579052
Joel F
Real men use unique_ptr
Posté le 29-11-2003 à 20:07:15  profilanswer
 

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.

n°580371
blackgodde​ss
vive le troll !
Posté le 01-12-2003 à 13:27:33  profilanswer
 

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


---------------
-( BlackGoddess )-
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Rattacher un descripteur de fichier à un fstreamfichier qui ne veut pas s'ouvrir...
[HTML] Ouvrir un lien dans une nouvelle page?[HTML]bouton radio multiple avec zone de texte
[CSS] Div -> le texte ne s'affiche pas car pas de scrollbar[MFC] Saisie de texte dans une fenêtre d'appli SDI
[Python] Comment créer un fichier ?Problème d'affichage des appostrophes dans un fichier
[html] Aligner du texte à gauche et à droite sur une même ligne[resol] 
Plus de sujets relatifs à : ouvrir fichier texte en binaire, réinventage de roue???


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR