Les fichiers binaires en C++ Qu’est ce que c’est: Un fichier binaire contient l’image mémoire des données que l’on écrit (on les stocke de la même façon qu’elles sont écrites dans la mémoire primaire). On veut mémoriser un prix : 123.458 Dans un fichier texte : il sera mémorisé sous la forme de 7 caractères. Tandis qu’en mémoire il est mémorisé sous la forme de 4 octets (taille d’un type float en C++). Dans un fichier binaire il sera donc mémorisé sous la forme de 4 octets (si on ouvre le fichier en texte on lira 4 char : êöB) Bases de la programmation en C++
Propriétés Le fichier est beaucoup plus léger en terme de taille ! La taille de la zone ne dépend que du type écrit et non de sa valeur. Chaque donnée ayant une taille connu dans le fichier binaire. On peut se positionner aisément ou on veut. Pas besoin de convertir les int, float ou structures en chaînes de caractères. Par contre le contenu des fichiers binaires est difficile à interpréter ou a visualiser. On mémorise dans un fichier un tableau de n structures TDate. En texte, il est très difficile d’accéder à la iéme date sans tout lire avant, car on ne connais pas la taille prise par l’écriture des autres dates. En binaire, on connais la taille d’une date. On peut donc se positionner aisément à la date que l’on veut lire. Bases de la programmation en C++
Comment ça marche? Pareil que les fichiers textes, mais il faut spécifier que l’on va travailler en binaire. ios::binary . Ecriture: fstream f; f.open (nom_physique , ios::out|ios::bin); f.write ( (char*)buff , n ); f.open (nom_physique , ios::in|ios::bin); f.read ( (char*)buff , n ); Adresse du bloc de donnée que l’on veut écrire transtypé en (char*) Taille du bloc (en octets) Bases de la programmation en C++
Exemple #include <fstream.h> int main () { // déclaration et ouverture d'un fichier texte fstream fich; // déclaration d’un réel que l’on veut écrire en binaire float k=123.458; // Ouverture du fichier en ecriture binaire fich . open ("fich1.txt" , ios::out|ios::binary ); // Ecriture en binaire du reel k; fich . write ((char*)&k, sizeof ( float )); // on a écrit à partir de l’adresse de k, un bloc de 4 octet // (on a donc écrit k en binaire) fich.close (); return 0; } Bases de la programmation en C++
Exemple fstream fich; short int Tab[5] = {1,2,3,4,5}; // tableau que l’on va écrire short int *TabLu = new short int [5]; // tableau résultant de la lecture //Ouverture en écriture binaire fich . open ("fich2.txt" , ios::out |ios::binary ); // Ecriture du tableau Tab. (sizeof ( short int ) egale 2 octets. fich . write ((char*)Tab, sizeof ( short int ) * 5); // fermeture du fichier fich.close (); //Ouverture en lecture binaire fich . open ("fich2.txt" , ios::in |ios::binary ); //Lecture de 5*2 = 10 octet (5 éléments de type short int) //que l’on écrit à partir de l’adresse TabLu fich . read ((char*)TabLu, sizeof ( short int ) *5); cout<<TabLu[0]<<TabLu[1]<<TabLu[2]<<TabLu[3]<<TabLu[4]; delete [ ]TabLu; Bases de la programmation en C++