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

  FORUM HardWare.fr
  Programmation
  C

  commen on utilise le binaire avec les fichiers ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

commen on utilise le binaire avec les fichiers ??

n°621775
Ded Jay
scratch
Posté le 26-01-2004 à 12:07:46  profilanswer
 

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
mood
Publicité
Posté le 26-01-2004 à 12:07:46  profilanswer
 

n°621777
chrisbk
-
Posté le 26-01-2004 à 12:08:50  profilanswer
 

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
n°621780
Taz
bisounours-codeur
Posté le 26-01-2004 à 12:11:15  profilanswer
 

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);

n°621781
chrisbk
-
Posté le 26-01-2004 à 12:12:48  profilanswer
 

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

n°621782
blackgodde​ss
vive le troll !
Posté le 26-01-2004 à 12:13:45  profilanswer
 

Code :
  1. std::ofstream


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

---------------
-( BlackGoddess )-
n°621783
Taz
bisounours-codeur
Posté le 26-01-2004 à 12:14:43  profilanswer
 

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

n°621784
chrisbk
-
Posté le 26-01-2004 à 12:15:48  profilanswer
 

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

n°621874
gilou
Modérateur
Modzilla
Posté le 26-01-2004 à 14:23:08  profilanswer
 

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é!  --
n°622128
Ded Jay
scratch
Posté le 26-01-2004 à 18:16:37  profilanswer
 

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
n°622199
gilou
Modérateur
Modzilla
Posté le 26-01-2004 à 19:29:12  profilanswer
 

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é!  --
mood
Publicité
Posté le 26-01-2004 à 19:29:12  profilanswer
 

n°622357
schnapsman​n
Zaford Beeblefect
Posté le 26-01-2004 à 22:26:09  profilanswer
 

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!"
n°622797
Ded Jay
scratch
Posté le 27-01-2004 à 13:39:43  profilanswer
 

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
n°623185
schnapsman​n
Zaford Beeblefect
Posté le 27-01-2004 à 22:34:27  profilanswer
 

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!"
n°623254
gilou
Modérateur
Modzilla
Posté le 27-01-2004 à 23:24:35  profilanswer
 

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é!  --
n°623460
matafan
Posté le 28-01-2004 à 02:43:41  profilanswer
 

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:

n°623687
Ded Jay
scratch
Posté le 28-01-2004 à 12:17:30  profilanswer
 

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
n°623858
blackgodde​ss
vive le troll !
Posté le 28-01-2004 à 14:56:32  profilanswer
 

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 )-
n°623861
Taz
bisounours-codeur
Posté le 28-01-2004 à 14:58:54  profilanswer
 

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


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

  commen on utilise le binaire avec les fichiers ??

 

Sujets relatifs
sur click copy and paste entre 2. fichiers .docTruc tout bête listes les fichiers d'un dossier
Nombre de fichiers dans un dossier[XML] Manipulation de fichiers XML
Générer le code binaire, par le récursif[java] suppression de fichiers/réps
Problème : Utilisation sous Unix de fichiers écrits sous Windows[Mugen] Formats de fichiers... ???
Gerer (l'ouverture des) les fichiers (en memoire) avec MTS ??[Shell] Parcourir un dossier avec des fichiers ayant des espaces.
Plus de sujets relatifs à : commen on utilise le binaire avec les fichiers ??


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