Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
manipuler fichier binaire en C
Envoyé par: demo2000

bonjour,
voilà mon fichier binaire avec un editeur hexadecimal :
Citation
demo2000
0A B5 08 A1 A2 B1 B2 C1 C2 D1 D2
0C B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2

avec :

pour le 1er enregistrement :
0A B5 08 A1 A2 B1 B2 C1 C2 D1 D2
--- |-----------les 10 octets---------------------|
|
le lenght
=
10 octets

pour le 2 ème :
0C B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2
--- |-----------les 12 octets-------------------------------|
12
octets

je voudrais :
1- supprimer la sequence d'octets qui correspond à B1 B2 dès que je la trouve dans l'enregistrement dans le fichier.
2- arranger le length de l'enregistrement puisqu'on à supprimer 2 octets de
ce dernier.

alors aprèe le traitement :
Citation
demo2000
08 B5 08 A1 A2 C1 C2 D1 D2
0C A4 B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2
NB : la séquence B1 B2 peut figurée dans plusieur enregistrement dans le fichiers
Merci

Poste le Friday 17 June 2005 12:30:09
Répondre     Citer    
Re: manipuler fichier binaire en C
Envoyé par: Sve@r

Boaf, pas trop difficile. Mais j'espère que tu connais déjà le C paske c'est un peu tiptop comme programme.

Voici l'idée
// 1) déclarer une structure pour gérer l'enregistrement
typedef struct {
char lg;
char data_in[256];
char data_out[256];
} t_enreg;

main()
{
t_enreg Enreg;
FILE *fp_in;
FILE *fp_out;

// 2) ouvrir les fichiers

fp_in=fopen("fichier_a_traiter", "r");
fp_out=fopen("fichier_sortie", "w");

// 3) faire une boucle de lecture en 2 étapes a) la longueur et b) le nb d'octets

while(1)
{
// Lire la longueur dans le fichier entrant
Enreg.lg=fgetc(fp_in);

// Eventuellement sortir de la boucle si on a atteint la fon de fichier
if (Enreg.lg == EOF)
break;

// Lire le nb d'octets
fread(Enreg.data_in, Enreg.lg, sizeof(char), fp_in);

// Recopier la zone "Enreg.data_in" dans "Enreg.data_out" en traitant
// les "B1B2"
// Il vaut mieux utiliser une fonction pour cela, cela simplifiera le source
// Et en plus la fonction peut retourner la nouvelle longueur
Enreg.lg=traitement(Enreg.lg, Enreg.data_in, Enreg.data_out);

// Ecrire la nouvelle longeur dans le fichier sortie
fputc(Enreg.lg, fp_out);

// Ecrire la nouvelle chaîne dans le fichier sortie
fwrite(Enreg.data_out, Enreg.lg, sizeof(char), fp_out);
}

fclose(fp_in);
fclose(fp_out);
}

// 4) écrire la fonction qui traite la chaîne
int traitement(int sz, char *data_in, char *data_out)
{
int i;
int lg;

// On boucle sur la chaîne entrante
lg=0;
for (i=0; i < sz; i++)
{
// Si les 2 octets à partir de "i" valent "B1B2"
if (data_in == '0xB1' && data_in[i + 1] == '0xB2')
{
// On décale "i" de "1" (il sera redécalé de "1" en fin de boucle)
i++;

// On retourne en début de boucle (donc "i" est décalé en final de "2")
continue;
}

// Ici, les 2 octets ne valent pas "B1B2" => on ne copie que le premier
data_out=data_in;

// On incrémente la longueur
lg++;

// On ne s'occupe pas du 2° octet => ptet qu'on était dans un cas "B1B1B2"
// Ce cas sera traité au tour suivant
}

// Normallement, data_out contient la nouvelle chaîne et "lg" sa longueur
return(lg);
}


Bon, j'ai tapé ça au feeling sans compiler ni tester mais cela me semble correct (en fait, mes commentaires m'ont servi de repère pour voir si c'était cohérent => non non, ce n'est pas une légende urbaine => les commentaires servent réellement dans un programme !!!)

Mais je l'ai écrit en considérant
1) que ta zone ne fait pas plus de 256 octets (puisque la longueur tient sur un octet)
2) que, à chaque longueur correspondait une zone équivalente

Normallement, c'est bon







Poste le Friday 17 June 2005 20:17:43
Répondre     Citer    
Re: manipuler fichier binaire en C
Envoyé par: demo2000

ça marche pas.
le fichier sortant contient toujour: B1B2
merci pour votre aide

Poste le Saturday 18 June 2005 12:54:08
Répondre     Citer    
Re: manipuler fichier binaire en C
Envoyé par: Sve@r

Petite erreur
Au lieu de
// Lire le nb d'octets
fread(Enreg.data_in, Enreg.lg, sizeof(char), fp_in);

Taper à la place
// Lire le nb d'octets
fread(Enreg.data_in, &Enreg.lg, sizeof(char), fp_in);

Poste le Saturday 18 June 2005 17:29:20
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
manipuler fichier binaire en C
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons