URL: https://linuxfr.org/forums/programmation-c--2/posts/manipuler-fichier-binaire Title: manipuler fichier binaire Authors: demo2000 Date: 2005年10月04日T19:01:55+02:00 Tags: Score: 0 voilà : fichier binaire : £spaces£ £/spaces£A1 A2 A3 A4 30 81 03 B1 B2 B3 £spaces£ £/spaces£A1 A2 A3 A4 30 82 00 04 B1 B2 B3 B4 £spaces£ £/spaces£A1 A2 A3 A4 30 83 00 00 03 B1 B2 B3 B4 B5 £spaces£ £/spaces£A1 A2 A3 A4 30 84 00 00 00 04 B1 B2 B3 B4 B5 £spaces£ £/spaces£A1 A2 A3 A4 30 07 B1 B2 B3 B4 B5 B6 B7 apres traitement : £spaces£ £/spaces30ドル 81 03 B1 B2 B3 £spaces£ £/spaces30ドル 82 00 04 B1 B2 B3 B4 £spaces£ £/spaces30ドル 83 00 00 03 B1 B2 B3 B4 B5 £spaces£ £/spaces30ドル 84 00 00 00 04 B1 B2 B3 B4 B5 £spaces£ £/spaces30ドル 07 B1 B2 B3 B4 B5 B6 B7 1- supprimer les 4 premier octets . 2- lire le tag suivant '30' . 3- lire le tag suivant INDIC 4- lire le length de l'information : si INDIC est 81 le length de l'information est sur 1 octet, 82 --> 2octet, 83 -->3octet, 84 -->4 octet. si non INDIC = length de l'information (dernière ligne dans l'exemple). NB : le contenu de length est en hexadecmal . voilà ou je suis : #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char argv) { FILE *infile; FILE *outfile; char buf[256]; // buffer de lecture static const char sequence[4] = {0x81,0x82,0x83,0x84}; char header[4]; // header unsigned char nb; unsigned char step; unsigned char tag[2]; unsigned long nbcdrall=0; int i,offset=24,nbcdrerr=0; unsigned char name; if ((infile = fopen(argv[1], "rb")) == NULL) { fprintf(stderr, "Pb ouverture infile !n"); return(EXIT_FAILURE); } if((name = strdup(argv[1])) == NULL) { fprintf(stderr,"Pb avec strdup !n"); return(EXIT_FAILURE); } if((outfile = fopen(strcat(argv[1],".NEW"),"wb")) == NULL) { fprintf(stderr, "Pb ouverture outfile !n"); fclose(infile); return(EXIT_FAILURE); } while (fread(header, 1, 4, infile) > 0) { if(!fread(tag, 1, 2, infile)) // read tag '30' and cdt { fprintf(stderr,"fread tag Failure !n"); return(EXIT_FAILURE); } if((unsigned char)tag[1] == (unsigned char)sequence[0]) { step='1'; } else if((unsigned char)tag[1] == (unsigned char)sequence[1]) { step='2'; } else if((unsigned char)tag[1] == (unsigned char)sequence[2]) { step='3'; } else if((unsigned char)tag[1] == (unsigned char)sequence[3]) { step='4'; } else step='0'; /* switch (((unsigned char)tag[1])) { case ((unsigned char)sequence[0]):step=1;break; case ((unsigned char)sequence[1]):step=2;break; case ((unsigned char)sequence[2]):step=3;break; case ((unsigned char)sequence[3]):step=4;break; case default:step=0; } /* if(!fread(&nb, 1, step, infile)) { fclose(infile); fclose(outfile); fprintf(stderr, "Pb lecture infile !n"); return(EXIT_FAILURE); } if(fread(buf, 1, nb, infile) != (unsigned int) nb) { fclose(infile); fclose(outfile); fprintf(stderr, "Pb lecture infile !n"); return(EXIT_FAILURE); } if((fwrite(tag, 1, 1, outfile)==0)|| (fwrite(buf, 1, nb , outfile)==0)) { fprintf(stderr,"fwrite failure !n"); return(EXIT_FAILURE); } } if(rename(argv[1],name)!=0) { fprintf(stderr,"rename failure !n"); return(EXIT_FAILURE); } return(EXIT_SUCCESS); } mon problème c'est que je n'arrive pas à avoir le bloc "nb" quand je fais : si step est superieur à 1 alors : £spaces£ £/spaces£fread(&nb, 1, step, infile) il lis seulement le premier octet. c.a.d: Fichier binaire : £spaces£ £/spaces£A1 A2 A3 A4 30 81 03 B1 B2 B3 // nb=03 --> OK £spaces£ £/spaces£A1 A2 A3 A4 30 82 00 04 B1 B2 B3 B4 //nb=00 au lieu 0004 £spaces£ £/spaces£A1 A2 A3 A4 30 83 00 00 03 B1 B2 B3 B4 B5 //nb=00 au lieu de 000003