18 avr. 2012

Lire et écrire dans un fichier binaire en C++

Un fichier binaire est un fichier contenant une succession d'octets, chacun d'eux pouvant prendre une valeur décimale allant de 0 à 255 (00 à FF en hexadécimal). En général on attribue une extension .bin ou .dat à un fichier binaire qui ne présente pas un format reconnu par un logiciel particulier. Dans le cas contraire, on lui attribue l'extension reconnue par ce logiciel. 
Un fichier binaire se distingue d'un fichier texte (extension .txt) en ce sens qu'il peut contenir des octets dont la valeur ne correspond à aucun des caractères reconnus par un éditeur de texte ordinaire. Pour cette raison un fichier binaire doit être lu soit avec un logiciel spécifique qui comprend son format, soit avec un éditeur hexadécimal. Dans le dernier cas, l'éditeur hexadécimal se contente d'afficher la valeur numérique (00 à FF) de chacun des octets contenus dans le fichier. 



Le présent tutorial montre, à l'aide d'un exemple, une solution (il en existe de nombreuses autres...) permettant de créer des fichiers binaires, puis de lire et écrire des octets à l'intérieur de ceux-ci à l'aide du langage C++.
Nous utiliserons l'environnement de développement freeware Code::Blocks, mais tout autre environnement de développement peut bien entendu être utilisé (DevCpp, Visual Studio Express...) 

Exemple : 


#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

int main()
{
FILE *fichier;
int i;
int t[100];
//-------------------------------------------------------
//creation du fichier fic1.dat et ecriture de 10 octets
//------------------------------------------------------
cout<<"Ecriture de 10 octets dans fic1.dat\n";
for (i=0;i<10;i++){t[i]= i;}
fichier = fopen("fic1.dat","w+b");
for (i=0; i <10; i ++)
{
fprintf (fichier,"%c", t[i]);
}
fclose(fichier);
system("pause");
//----------------------------------------
//Lecture d'octets dans le fichier fic1.dat
//--------------------------------------
cout<<"Lecture de 10 octets dans fic1.dat\n";
fichier=fopen("fic1.dat","r");
for (i=0; i <10; i ++)
{
fseek(fichier,i,SEEK_SET);
t[i]=fgetc(fichier);
}
fclose(fichier);
system("pause");
//-----------------------------------------------
//Creation du fichier fic2.dat et écriture de 10 octets
//------------------------------------------------
for (i=0;i<10;i++){t[i]= 10+t[i];}
cout<<"Ecriture de 10 octets dans fic2.dat\n";
fichier = fopen("fic2.dat","w+b");
for (i=0; i <10; i ++)
{
fprintf (fichier,"%c", t[i]);
}
fclose(fichier);
cout<<"Fin du traitement\n";
system("pause");
return 1;
}