Ecrire et relire un fichier binaire.

Un exemple pour écrire et relire simplement dans un fichier quelconque en C.

fread,fwrite

Voir version :

Pas de dépendances

Télécharger :

#include <stdio.h>


void ecriture1()
{
    FILE* F;
    int a,b;
    double d;
    printf("-- ecriture1\n");
    F = fopen("test.bin","wb");
    a = 5;
    b = 6;
    d = 5.065;
    fwrite(&a,sizeof(int),1,F);
    fwrite(&d,sizeof(double),1,F);
    fwrite(&b,sizeof(int),1,F);    
    fclose(F);
}

void lecture1()
{
    int a;
    int b;
    double d;
    FILE* F;
    printf("-- lecture1\n");
    F = fopen("test.bin","rb");
    fread(&a,sizeof(int),1,F);
    fread(&d,sizeof(double),1,F);
    fread(&b,sizeof(int),1,F);    
    printf("a = %d ; d = %lf ; b = %d\n",a,d,b);
    fclose(F);
}

int main()
{
    ecriture1();    
    lecture1();    
    return 0;
}



Commentaires


  Ce tuto est déja plus complexe que les précédents.

  Il va permettre d'écrire un fichier binaire, et de le relire.

  On parle de fichier binaire pour parler d'un fichier non-texte.
  Il est a noter que meme un fichier texte est binaire, en réalité, il n'existe QUE des fichiers dit "binaires".
  --> Ils sont tous composés d'une suite d'octets (les EXE, les TXT, les MP3, JPG, MPG, AVI, ..... TOUT !!!)

  Pour apprécier le tuto, je vous conseille d'installer un éditeur Hexa (ultraedit, hexworkshop, winhex, ou autre...)
  (vous trouverez des éditeurs hexa sur telecharger.com

  L'éditeur hexa va vous permettre d'ouvrir n'importe quel fichier pour voir ce qu'il y a dedans (y compris les fichiers texte).
  C'est en quelque chose sa chaine ADN.
  Ne criez pas au miracle : ce n'est pas parce que vous voyez les données qui composent un fichier que vous pouvez le relire facilement
  Un fichier dont on ne connait pas le format est une "soupe d'octets". Si vous ne connaissez pas le codage, vous ne pourrez pas en faire grand chose.

  Certains codages sont publics et connus (BMP, JPG, MP3, etc....)
  Meme le codage des  EXE est connu : mais ne vous attendez pas a lire du code C en éditant un EXE : un EXE est du code machine compilé,
  un truc imbouffable...

  Certains programmeurs ou hackers pratiquent le "reverse engeneering" : ils analysent les fichiers depuis un éditeur hexa, pour
  essayer d'en retrouver le codage : c'est une tache ardue et tres tres longue....


  Revenons au fichier :

// l'écriture

  dans ecriture1(), j'ouvre cette fois ci le fichier en ecriture binaire : "wb"

  la seule fonction d'écriture est ensuite fwrite.
  fwrite(pointeur,taille,nombre,fichier)

  cette fonction ecrit recopie "taille" octets dans fichiers a partir de pointeur.
  Si vous changez "nombre", elle va faire ça "nombre" fois -> pour écrire les éléments d'un tableau par exemple.

  fwrite(&a,sizeof(int),1,F);

  sizeof(int) vaut 4 octets dans notre cas.
  
  va donc écrire dans F 4 octets a partir de l'adresse de a : et a fait précisément 4 octets : donc ça va écrire a.
  pareil pour d, et b 
  a chaque fois, il est prudent de mettre sizeof(type_de_donnee_a_ecrire).

  Ainsi, nous avons ecrit toutes les données les unes apres les autres, en binaire.

// edition binaire

  Ouvrez le fichier test.bin avec un éditeur hexa, vous obtenez la chaine suivante :

  00000000h: 05 00 00 00 C3 F5 28 5C 8F 42 14 40 06 00 00 00 ; ....Ãõ(\B.@...

  Notez que sur un mac, vous n'obtiendrez pas tout a fait la meme chose, mais peu importe.
  Ignorez la partie apres le ; -> c'est la représentation ASCII du code hexa du milieu
  Ignorez la partie a gauche   -> c'est l'offset dans le fichier : ici, c'est l'offset 0, car on lit le début du fichier.

  on s'intéresse donc à :

  05 00 00 00 C3 F5 28 5C 8F 42 14 40 06 00 00 00

  Nous savons qu'on a ecrit un int (4 octets), puis un double (8 octets), puis un int, 4 octets
  Du coup, on peut découper le fichier ainsi :

  05 00 00 00   <-- le premier int qui vaut 5
  C3 F5 28 5C 8F 42 14 40 <-- le double
  06 00 00 00   <-- le deuxieme int qui vaut 6

  note : je peux découper le fichier comme ça, car je connais le codage (un int, un double, un int : c'est ça le codage)
  Si je ne le connaissais pas, impossible d'annoncer que c'est un int, un double, un int
  -> ça pourrait etre 2 short, 2 int, 2 short, ou alors plein d'autres possibilités !

  Pour les codages des int : ils sont codés, le poids faible a gauche sur les processeurs INTEL et AMD (PC)
  Sur un mac, vous serez en codage Big endian : comme ça 00 00 00 05
  Pour le codage du double, il est plus complexe, je vous laisse regarder ce lien pour les codages :

  http://fr.wikipedia.org/wiki/IEEE_754

  Peu importe, finalement, comment c'est codé, l'essentiel est de pouvoir faire le découpage.

// la relecture

  Pour relire le fichier, on ouvre le fichier en binaire avec "rb" dans le fopen.
  L'essentiel sera de relire le fichier DANS LE MEME ORDRE que son ordre d'écriture : sinon, on relis n'importe quoi.

  La fonction fread marche comme la fonction fwrite : meme parametres.

  Et on retrouve bien nos données passées.

  
  note : il est tout a fait possible d'ouvrir des fichiers texte en binaire (donc avec "wb" ou "rb")


  Ce tuto était une tres courte intro sur le monde enorme qu'est le monde du codage des données.
  Vous pourrez ainsi sauvergarder vos données, dans votre format personnalisé, avec l'extention que vous voulez
  (j'ai mis .bin, mais vous pouvez mettre ce que vous voulez)


Laissez un commentaire / post a comment