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