Lecture d'un fichier octet par octet
Salut,
Je pratique le c depuis peu (pour le plaisir :wink: ) et je cherche à implémenter un petit programme de compression utilisant l'algorithme de huffman.
J'ai écrit le code suivant :
huffman.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #ifndef __HUFFMAN_H
#define __HUFFMAN_H
#include "huffman.h"
void parser (const char *f, unsigned long int t[256])
{
FILE *fp;
char buffer;
if ((fp = fopen (f, "r")) == NULL)
{
fprintf (stderr, "Echec de l'ouverture du fichier %s", f);
perror (" ");
exit (1);
}
while (1)
{
if (fread (& buffer, sizeof (char), 1, fp) == 1)
{
t[buffer]++;
}
else
{
break;
}
}
fclose (fp);
}
#endif /* __HUFFMAN_H */ |
huffman.c
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<stdio.h>
#include<stdlib.h>
#include "huffman.h"
const char *file;
unsigned long int tab[256];
int main (int argc, char *argv[])
{
file = argv[1];
int i;
for (i=0 ; i<256 ; i++)
{
tab[i]=0;
}
parser (file, tab);
} |
Comme vous pouvez le constater, j'en suis simplement à la phase initiale (calcul des occurences de chaque octet).
En fait, je ne sais pas si je procède de la meilleure des façons : venant du perl, je ne suis pas habitué à manipuler les types de données. Ici, j'ai défini un buffer de type char (pour y stocker un octet), mais je ne sais pas d'une part si je récupère une valeur décimale avec fread, et d'autre part si l'écriture :
est valable, ou si je dois réaliser un cast de la sorte :
En tout cas, j'ai testé cette dernière solution qui n'a pas eu l'air de heurter gcc :)
Pour terminer, j'ai écrit ça pour valider le fonctionnement de mon code :
Code:
1 2 3 4 5 6 7 8
| for (i=0 ; i<256 ; i++)
{
if (tab[i] != 0)
{
printf ("Indice : %d, valeur : %d\n", i, tab[i]);
}
}
return (0); |
Et je me tape une vielle erreur de segmentation, ça fonctionne juste si je conserve la première partie du printf comme ceci :
Code:
printf ("Indice : %d\n", i);
A ce moment là, j'obtiens ça :
Citation:
Indice : 10
Indice : 32
Indice : 38
Indice : 45
Indice : 46
Indice : 47
Indice : 48
Indice : 49
Indice : 50
Indice : 51
Indice : 52
Indice : 53
Indice : 54
Indice : 56
Indice : 58
Indice : 60
Indice : 61
Indice : 62
Indice : 67
Indice : 71
Indice : 95
Indice : 97
Indice : 98
Indice : 99
Indice : 100
Indice : 101
Indice : 102
Indice : 103
Indice : 104
Indice : 105
Indice : 107
Indice : 108
Indice : 109
Indice : 110
Indice : 111
Indice : 112
Indice : 113
Indice : 114
Indice : 115
Indice : 116
Indice : 117
Indice : 118
Indice : 119
Indice : 120
Indice : 122
Houla, je viens de me rendre que le code plante si je lui passe autre chose qu'un fichier texte en argument, je crois qu'il y a du boulot en perspective... Si une âme charitable pouvait me donner quelques indications, j'aimerais vraiment progresser en c !
Merci d'avance pour vos réponses.
Re: Lecture d'un fichier octet par octet
Citation:
Envoyé par Yux
Je pratique le c depuis peu et je cherche à implémenter un petit programme de compression utilisant l'algorithme de huffman.
C'est pas vraiment ce qu'il y a de plus simple...
Citation:
J'ai écrit le code suivant :
huffman.h
Code:
1 2
| #ifndef __HUFFMAN_H
#define __HUFFMAN_H |
Non. Tu n'es pas implémenteur.
http://emmanuel-delahaye.developpez....htm#id_reserve
Citation:
Code:
1 2 3 4
|
#include "huffman.h"
void parser (const char *f, unsigned long int t[256]) |
Ce '256' a une valeur documentaire, mais pas fonctionelle.
Code:
void parser (const char *f, unsigned long int t[])
Citation:
Code:
1 2 3 4 5
|
{
FILE *fp;
char buffer;
if ((fp = fopen (f, "r")) == NULL) |
Attention, mode texte. Ne fonctionne que si le fichier est du texte pur. Sinon, mode binaire (0-255).
Citation:
Code:
1 2 3 4 5 6 7 8 9
|
{
fprintf (stderr, "Echec de l'ouverture du fichier %s", f);
perror (" ");
exit (1);
}
while (1)
{
if (fread (& buffer, sizeof (char), 1, fp) == 1) |
Tordu. fgetc() suffit largement...
Citation:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
{
t[buffer]++;
}
else
{
break;
}
}
fclose (fp);
}
#endif /* __HUFFMAN_H */ |
[/code]
Hein, quoi ? Du code dans un header ? Ne refais jamais ça!
http://emmanuel-delahaye.developpez.com/codage.htm