Les fichiers
Nous allons, dans ce chapitre, apprendre à manipuler les fichiers du disque dur en C. Nous allons voir comment lire un fichier et ses informations, comment les modifier et comment créer des fichiers
Voyons à quoi cela peut bien servir:
Prenez le jeu Mario. Le but est de collecter le plus d'étoile possible. Pour cela il suffit d'une variable qui s'incrémentera à chaque fois que l'on gagne une étoile. Là c'est simple
Mais imaginez maintenant que le jeu dur tellement longtemps qu'il est impossible de le terminer en 5 minutes. Dans ce cas-là, le joueur aimerais peut être bien éteindre son PC ou fermer le jeu pour reprendre la partie plus tard.
Problème: La mémoire vive sera effacée et toutes les étoiles gagnées reviendront au nombre de 0.
Il y a de quoi faire rager le joueur

Pour contourner cet inconvénient, il fallait trouver quelque chose qui reste dans la mémoire de l'ordinateur quoi qu'il arrive: les fichiers.
Nous allons donc voir comment ouvrir et fermer un fichier puis comment écrire dedans et lire son contenu
Ouverture et fermeture d'un fichier
Avant d'écrire ou de lire un fichier, encore faudrait-il savoir l'ouvrir

Et c'est ce que nous allons apprendre ici
Voici le prototype de la fonction permettant d'ouvrir un fichier (Remarque: à partir de maintenant je vous montrerais les prototypes des nouvelles fonctions que l'on utilise, cela sera beaucoup plus simple

):
FILE* fopen(const char* nomFichier, const char* typeOuverture);
Nous voyons que le premier paramètre est le nom du fichier à ouvrir. Pour cela, il suffit de mettre un type char ou directement le nom comme ceci:
fopen("essai.txt", const char* typeOuverture);
Le second paramètre "typeOuverture" est aussi une chaîne de caractères dans laquelle est placé l'un des "mots" suivants:
a
a+
r
r+
w
w+
Chaque "mot" permet d'ouvrir le fichier dans un mode différent. Les voici, ici, décrit:
"a" --> Permet d'écrire à partir de la fin du fichier.
Le fichier sera créé s'il n'existe pas.
"a+" --> Permet d'écrire et de lire à partir de la fin du fichier.
Le fichier sera créé s'il n'existe pas.
"r" --> Permet de lire dans le fichier.
Le fichier doit avoir été créé.
"r+" --> Permet de lire et d'écrire dans le fichier.
Le fichier doit avoir été créé.
"w" --> Permet d'écrire dans le fichier.
Le fichier sera créé s'il n'existe pas.
"w+" --> Permet de lire et d'écrire dans le fichier en supprimant d'abord tout son contenu.
Le fichier sera créé s'il n'existe pas.
Si vous souhaitez créer un fichier pour écrire par la suite dedans, il vous suffit d'écrire ceci:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
/*On créer un pointeur de type FILE (structure créée spécialement pour la gestion des fichiers)*/
FILE
*monFichier
= NULL
; //Bien penser à initialiser le pointeur à NULL.
/*On créer le fichier test.txt pour pouvoir écrire dedans par la suite.*/
monFichier = fopen("test.txt", "a");
return 0;
}
Nous avons créé un fichier dans le même répertoire que votre projet
C'est ce que l'on appelle
le chemin relatif.
Le chemin relatif désigne un fichier à partir de l'endroit où votre programme est ouvert.
Le chemin absolu est le chemin complet.
Pour naviguer de dossiers en dossiers en C, il suffit de mettre un slash "/" ou deux antislashs d'affilés dans la chaine de caractère correspondant au nom du fichier. Comme ceci:
fopen("unDossier/unDeuxieme/monFichier.txt", "a"); /*Chemin relatif, c'est-à-dire que l'on suit ce chemin depuis l'emplacement de lancement de l'éxcutable.*/
fopen("C:/Program Files/test.txt", "a"); /*Chemin absolu, c'est à dire que quel que soit l'emplacement de lancement de l'application, nous ouvrirons toujours le même fichier indiqué*/
Enfin, il faut, une fois toutes les modifications de faîtes, fermer le fichier. Nous allons pour cela utiliser la fonction fclose qui a pour seul paramètre le pointeur associé au fichier à fermer.
Exemple:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
FILE
*monFichier
= NULL
;
monFichier = fopen("test.txt", "a");
fclose
(monFichier
); //On ferme le fichier préalablement ouvert.
return 0;
}
Jusqu'ici, rien de bien dur normalement
Court moment de culture générale^^:
Toutes les fonctions, les structures nécessaires à la gestion des fichiers se trouvent dans la librairie stdio.h. Il faut donc bien penser à inclure cette bibliothèque (c'est ce que l'on fait depuis le début de ce tutoriel

)
Bien. Vous savez ouvrir et fermer n'importe quel fichier présent sur le disque dur. Vous savez même en créer un (avec le type d'ouverture "a").
Savez-vous aussi que l'on peut aussi supprimer un fichier? Il faut pour cela utiliser la fonction remove. Voici son prototype:
int remove
("LefichierASupprimer");
Cette fonction renvoie 0 si elle se termine correctement et qu'elle a réussi à supprimer le fichier. Sinon elle renvoie -1.
Notez qu'il ne faut pas préalablement ouvrir le fichier à supprimer avec fopen!
Petit exemple:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int maVariable = remove("test.txt"); //On supprime le fichier.
if(maVariable == 0)
printf("Le fichier test.txt a ete supprime!");
else
printf("Impossible de supprimer le fichier");
return 0;
}
Attention
Une fois le fichier supprimé, celui-ci l'est vraiment
et n'est pas placé dans la corbeille!
Attention donc de ne pas supprimer n'importe quoi!
Vous pouvez aussi renommer un fichier. Pour cela on utilise la fonction rename. Voici son prototype:
rename("nomOriginal", "nomApresRenommage");
Je vous passe la nécessité d'un code complet, cette fonction s'utilise quasiment de la même façon que remove
Ecrire dans un fichier:
La fonction permettant ceci est fprintf.
Elle s'utilise exactement comme printf mais n'a pas le même prototype. Le voici:
fprintf(pointeurFichier, "MonTexte", ...);
Je m'explique:
pointeurFichier est un pointeur de type FILE et qui est associé au fichier dans lequel vous souhaitez écrire. Attention! Veillez bien à ce que votre type d'ouverture de fichier accepte l'écriture! (Par exemple "a" est correct).
Le second paramètre est le texte à écrire dans le fichier et le troisième est optionnel, il s'agit des éventuels variables que vous souhaiteriez écrire dans le fichier.
Voici un exemple pour mieux comprendre:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
FILE
*monFichier
= NULL
;
monFichier
= fopen
("test.txt", "a"); //On ouvre le fichier en mode écriture.
fprintf
(monFichier
, "Hello world!");
fclose
(monFichier
); //On ferme le fichier préalablement ouvert.
return 0;
}
Ce code créera donc un fichier test.txt (si celui-ci n'existe pas déjà) et écrira dedans "Hello World!".
Pour écrire une variable dans un fichier, il faut faire exactement la même chose qu'avec printf
Exemple:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
int maVariable
= 36;
FILE
*monFichier
= NULL
;
monFichier
= fopen
("test.txt", "a"); //On ouvre le fichier en mode écriture.
fprintf
(monFichier
, "maVariable vaut %d", maVariable);
fclose
(monFichier
); //On ferme le fichier préalablement ouvert.
return 0;
}
Lire dans un fichier
Avant toutes choses, vérifiez bien que le fichier est ouvert en mode lecture
et qu'il existe.
Pour vérifier si un fichier existe, il suffit de faire ceci:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
FILE
*monFichier
= NULL
;
monFichier
= fopen
("test.txt", "r"); //On ouvre le fichier en mode lecture.
if(monFichier
== NULL
) //Si le fichier n'existe pas.
printf
("Impossible d'ouvrir ce fichier, celui-ci n'existe pas.");
else //Sinon si le fichier existe, on fait ce que l'on veut et on le referme.
{
fclose
(monFichier
); //On ferme le fichier préalablement ouvert.
}
return 0;
}
Attention
Il vous faut impérativement fermer le fichier dans la condition que le fichier existe! Si vous fermez un fichier qui n'existe pas, il y aura un joli crash de votre application!
Pour maintenant lire dans un fichier, il vous suffit d'utiliser fscanf qui s'utilise de la même façon que scanf:
fscanf(pointeurFichier, "%d", variable);
Où pointeurFichier est le pointeur associé au fichier voulu.
Ensuite, il faut savoir comment le fichier est structuré. Par exemple, si le fichier contient ceci:
145
Et que vous souhaitez lire le chiffre, il vous suffit d'écrire ceci:
fscanf(pointeurFichier, "%d", variable);
Et le chiffre sera logiquement placé dans "variable".
De même, si vous avez, par exemple, deux chiffres comme ceci:
154 875
Il vous suffit d'écrire:
fscanf(pointeurFichier, "%d %d", variable, variable2);
Et de même pour les chaines de caractères

Il y a plusieurs autres fonctions comme fgets, fgetc, etc.. mais nous les verrons en temps voulu
J'espère une nouvelle fois m'être fait comprendre sur ce chapitre

Je le redis une nouvelle fois, il est
très important de comprendre ce que vous faites et d'écrire du code tout seul sans aide en apprenant de ses erreurs. Essayez de créer vous-même des petits programmes.
Le chapitre suivant sera le dernier cours sur le langage C avant l'apparition des programmes en fenêtres! C'est pourquoi il est plus que jamais important de suivre!
Les structures L'allocation dynamique