commen on utilise le binaire avec les fichiers ??

commen on utilise le binaire avec les fichiers ?? - C - Programmation

Marsh Posté le 26-01-2004 à 12:07:46    

alor voila, j'ai appris il n'y a pas tres longtemp le code de Huffman où on se sert des arbres binaires pour faire un nouveau code ascii, mais le probleme c'est qu'il faut pouvoir écrire ce nouveau code en binaire dans un fichier
 
FILE * fichier = fopen (nomFichier, "r+b" );
 
pour l'ouverture du fichier ya aucun probleme, mais c'est pour l'ecriture que je ne vois pas comment faire
 
le probleme c'est que je dois pouvoir ecrire dans le fichier un bit apres l'autre
 
j'ai essayé un truc du genre  
 
fprintf (fichier, "0" );  
 
mais il me l'écrit en ascii standard, ce qui fait que mon fichier compressé est plus gros que le fichier source ....
 
donc voila, j'espere que vous avez compris mon probleme et que qelqu'un saura me trouver la solution.
 
merci


Message édité par Ded Jay le 26-01-2004 à 12:33:52

---------------
kil fé bon programmer en c lieux
Reply

Marsh Posté le 26-01-2004 à 12:07:46   

Reply

Marsh Posté le 26-01-2004 à 12:08:50    

la solution ?  
prendre un bouquin de C et le lire
mais j'imagine que ca c'est pas possible, alors la solution :
 
int a = 0;
fwrite(&a,4,1,fichier);
 
ah merde, tu veux ecrire bit a bit
bon ben ca c'est pas possible au min tu peux ecrire que par octet
 
fo faire genre un "buffer".  
 


Message édité par chrisbk le 26-01-2004 à 12:09:43
Reply

Marsh Posté le 26-01-2004 à 12:11:15    

euh c'est du C ça :o
 
 
chris >  
int a = 0;
fwrite(&a,4,1,fichier);  
 
 
:non:
 
int a = 0;
fwrite(&a, sizeof a, 1, fichier);

Reply

Marsh Posté le 26-01-2004 à 12:12:48    

version cracra au debotté.
<note aux autres : oui c'est tres cracra, mais aussi tres au deboté>
 

Code :
  1. void writetruc(FILE *out, char val)
  2. {
  3. static char value=0;
  4. static int dep=0;
  5. if (val == 0 || val ==1)
  6. {
  7. value = value | (val << dep);
  8. dep++;
  9. if (dep == 8)
  10. {
  11. fwrite(&value,1,1,out);
  12. value=0;
  13. dep=0;
  14. }
  15. }
  16. else //on va prendre ca comme une directive de flush
  17. {
  18. if (dep !=0)
  19. {
  20. fwrite(&value,1,1,out);
  21. dep = 0;
  22. value = 0;
  23. }
  24. }
  25. }


 
a toi de faire plus propre

Reply

Marsh Posté le 26-01-2004 à 12:13:45    

Code :
  1. std::ofstream


Message édité par blackgoddess le 26-01-2004 à 12:14:07

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

Marsh Posté le 26-01-2004 à 12:14:43    

if (dep == 8)
 
hum hum
 
CHAR_BIT :D
 
 
 
bof, moi je dissociera écriture et traitement de donnée :o

Reply

Marsh Posté le 26-01-2004 à 12:15:48    

J'ai dit que c'etat cracra :o
genre si t'ecris dans deux fichier differents avec ce truc tu va avoir de drole de suprises :D

Reply

Marsh Posté le 26-01-2004 à 14:23:08    

Un truc comme ca devrait marcher si ton pb est d'ecrire comme un bit, un truc represente par un char, de valeur 0 ou 1:  
Tu appelles la fonction suivante avec flushend a false, et une fois ecrit ce que tu devais ecrire, tu l'appelle une fois avec flushend a true (bon, je presuppose que tu auras ecris exactement le nb de bits sauvegardes qque part avant, dans ton fichier, afin de pouvoir savoir ou tu t'arretes a la relecture):  
 

Code :
  1. void writetruc(FILE *out, unsigned char val, bool flushend)
  2. {
  3.   /* si c'est pas ecrit dans le bon ordre, inverser les valeurs de la table */
  4.   static unsigned char[8] mask = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
  5.   static int rank = 0;
  6.   static unsigned char value = 0;
  7.   if (flushend)
  8.     {
  9.       fwrite(&value,1,1,out);
  10.       fflush(out);
  11.       return;
  12.     }
  13.   rank %= 8;
  14.   if (val)
  15.     value |= mask[rank];
  16.   if (rank == 7)
  17.     {
  18.       fwrite(&value,1,1,out);
  19.       value = 0;
  20.     }
  21.  
  22.   rank++;
  23. }


 
ou en reprenant a mon compte l'astuce de la valeur finale ni a 0 ou a 1 pour flusher:
 

Code :
  1. void writetruc(FILE *out, unsigned char val)
  2. {
  3.   /* si c'est pas ecrit dans le bon ordre, inverser les valeurs de la table */
  4.   static unsigned char[8] mask = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
  5.   static int rank = 0;
  6.   static unsigned char value = 0;
  7.   if (val > 1)
  8.     {
  9.       fwrite(&value,1,1,out);
  10.       fflush(out);
  11.       return;
  12.     }
  13.   rank %= 8;
  14.   if (val)
  15.     value |= mask[rank];
  16.   if (rank == 7)
  17.     {
  18.       fwrite(&value,1,1,out);
  19.       value = 0;
  20.     }
  21.  
  22.   rank++;
  23. }


 
A+,


Message édité par gilou le 26-01-2004 à 14:36:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-01-2004 à 18:16:37    

heu ... là je suis pas tout ...
 
prenons un exemple pour mieux me faire comprendre
 
la lettre 'a' a un nouveau code sur 3 bits : 110
'b' -> 1101
 
pour chaque lettre, je retiens le chiffre en int (ex: a = 6, b = 13) et le nombre de bit sur lequel il doit etre codé (ex:a = 3, b = 4)
 
donc, si dans un fichier ya ecrit : 'ba' , dans le fichier codé, joré : 1101110
 
donc le probleme, c que je ne peu pa me permettre de dire j'atten d'avoir 8 bits a écrire, pi je calcul le bazard et enfin j'écrit
 
voila, j'espere que le probleme est un peu plus clair


---------------
kil fé bon programmer en c lieux
Reply

Marsh Posté le 26-01-2004 à 19:29:12    

OK, donc ton pb etait mal posé au depart, et on a repondu a coté. Néanmoins, tu ne sembles pas saisir qu'on ne peut ecrire dans un fichier que octet par octet. Il faudra donc que ton algo d'ecriture attende d'avoir un octet (et si la derniere lettre ne tient pas sur 1 octet, tu peux inscrire la taille utilisée dans l'octet suivant, pour savoir a la relecture comment tu vas relire cet avant dernier octet du fichier).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-01-2004 à 19:29:12   

Reply

Marsh Posté le 26-01-2004 à 22:26:09    

Ded Jay a écrit :


[citation]
la lettre 'a' a un nouveau code sur 3 bits : 110
'b' -> 1101


raté, avec hufmann aucun code n'est le préfixe d'un autre  :D  


donc le probleme, c que je ne peu pa me permettre de dire j'atten d'avoir 8 bits a écrire, pi je calcul le bazard et enfin j'écrit


et bien si au contraire, c'est ce que tu dois faire. Pour les neuneux il existe une implémentation bien naze du genre:

Code :
  1. unsigned char* myBits = malloc(huffmanSize*2);
  2. int nbBits;


à chaque caractère à coder, tu concatène le code dans myBits et tu vérifie si nbBits/8>0, auquel cas tu vides de myBits tous les octets complets (sous forme compacte bien sur).


Message édité par schnapsmann le 26-01-2004 à 22:41:51

---------------
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-01-2004 à 13:39:43    

sorry pour la pitite erreur mé bon g taper 2 codes a pouf
 
par contre ta methode a l'air interressante
 
mé g trouvé une autre facon de faire : j'écrit un fichier avec des bits en forme de caracteres et pi je fé une compression de ce fichier en transformant 8 "bits" en 1 caracteres ke je peu réécrire ds un otre fichier ...


---------------
kil fé bon programmer en c lieux
Reply

Marsh Posté le 27-01-2004 à 22:34:27    

Ded Jay a écrit :


j'écrit un fichier avec des bits en forme de caracteres et pi je fé une compression de ce fichier en transformant 8 "bits" en 1 caracteres ke je peu réécrire ds un otre fichier ...


 :o


---------------
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-01-2004 à 23:24:35    

Bref encore un probleme de longueur de bits :whistle:  
 [:pioupiou]  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-01-2004 à 02:43:41    

Si tu es capable de le faire en deux fichiers, faudra m'expliquer pourquoi tu peux pas le faire en un buffer + un fichier :heink:

Reply

Marsh Posté le 28-01-2004 à 12:17:30    

paske g pa envi de creer un buffer avec une taille max, je fé ds le dynamique, moi mosieu :D


---------------
kil fé bon programmer en c lieux
Reply

Marsh Posté le 28-01-2004 à 14:56:32    

tu peux faire un buffer dynamique aussi non ...
 
puis niveau perf la solution du buffer est meilleure ...  
parce que entre créer un buffer pour un fichier et créer un fichier, ya pas photo hein ...


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

Marsh Posté le 28-01-2004 à 14:58:54    

bah un buffer de 1 octet ça peut suffir, le tout c'est de faire un truc un peu souple pour jouer sur cette taille, mais la bufferisation des FILE* est là, ce qu'il ne faut as oublier

Reply

Sujets relatifs:

Leave a Replay

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