Une notion importante de la programmation en C est le traitement des fichiers. Il est très important de savoir utiliser les fichiers car ils sont très pratiques, ne serait-ce que pour sauver la configuration de votre programme. Nous allons dans ce cours apprendre simplement comment ouvrir un fichier et comment le fermer ensuite.
Les fichiers sont en fait représentés sous forme de flux, comme stdin, stdout et stderr (sur lesquels il y a un cours dans la partie base). Sachez également que nous allons introduire ici le mot curseur. Le curseur est en fait le position à laquelle est le fichier. Si par exemple, vous avez un fichier qui contient le mot salut, si nous lisons ce mot et disons que le curseur se trouve après le mot salut, il se trouvera en position 5, car il sera derrière le mot. Le curseur est donc la position courante dans le fichier.
Pour ouvrir un fichier, il vous faut utiliser la fonction fopen qui se trouve dans la bibliothèque stdio.h. La syntaxe de cette fonction est la suivante :
Comme vous le voyez cette fonction renvoie un pointeur de type FILE qui contiendra un pointeur vers le fichier ouvert, ce pointeur vaudra NULL si un problème est survenu lors de l'ouverture. Il ne faut pas inclure de bibliothèques spéciales pour le type FILE, celui-ci est déjà déclaré dans stdio.h.
Cette fonction prend deux paramètres, le premier, le plus logique est le chemin d'accès vers le fichier, celui-ci peut être absolu ou relatif (ex : absolu = c:abc.txt, relatif = c.txt). Le deuxième argument lui est la façon dont on ouvre le fichier, cet argument est simplement une chaine de caractères, voici les différentes possibilités :
r : r signifie read voulant ainsi dire que le fichier devra être ouvert uniquement en lecture et non en écriture. Quand vous utilisez ce mode, le curseur se placera au début du fichier.
r+ : La différence entre r et r+ est que le fichier sera ouvert en lecture ET en écriture, mais le curseur sera toujours placé au début du fichier.
w : Le fichier sera ici ouvert en écriture. Si le fichier n'existait pas, la fonction le crée, par contre si il existe, son contenu sera écrasé, donc votre fichier sera vide après l'appel à cette fonction si il contenait quelque chose. Le curseur est également positionné au début du fichier.
w+ : Vous pouvez également utiliser w+ pour ouvir le fichier en écriture ET en lecture. Si le fichier n'existait pas, la fonction le crée, par contre si il existe, son contenu sera écrasé, donc votre fichier sera vide après l'appel à cette fonction si il contenait quelque chose. Le curseur est également positionné au début du fichier.
a: Le fichier sera ici ouvert en ajout (donc il écrira à la fin du fichier). Si le fichier n'existait pas, la fonction le crée. Le curseur est par contre positionné à la fin du fichier.
a: Le fichier sera ici ouvert en ajout (donc il écrira à la fin du fichier) ET en lecture. Si le fichier n'existait pas, la fonction le crée. Le curseur sera positionné au début du fichier, mais lorsque vous écrirez dans le fichier, ce sera TOUJOURS à la suite du contenu de celui-ci.
Il y a assez avec ces 3 modes d'ouvertures pour faire ce que nous désirons mais souvenez vous d'une chose que l'on a souvent tendance à oublier. Si vous ouvrez votre fichier en a ou a+ et que vous tentez une écriture dedans, celle-ci se fera TOUJOURS à la fin du fichier, même si vous vous êtes déplacé dans le fichier.
Une autre subtilité est l'ajout du caractère b dans le mode d'ouverture. Effectivement, certains systèmes d'exploitation traite les fichiers binaires et les fichiers textes différemment, ajouter le b comme dernier caractère ou entre le caractère et le + vu ci dessus peut signaler au système d'exploitation que le fichier à exploiter est un fichier binaire. Personnelement, je vous conseille de le mettre pour assurer la compatibilité entre les systèmes lorsque vous désirez utiliser un fichier binaire, dans le cas contraire, ne le mettez pas, les formats deviennent donc :
ab, ab+, rb, rb+, wb, wb+
Une fois que vous avez ouvert un fichier, il vous faut le fermer, effectivement vous devez fermer un fichier pour la même raison que vous désallouez les pointeurs. La fonction de fermeture d'un fichier est très simple, sa syntaxe est la suivante :
Cette fonction renvoie 0 si elle réussit et le code de l'erreur dans le cas contraire (pour savoir que faire de ce code, rendez vous dans la partie gestion d'erreurs). L'argument que l'on doit passer à cette fonction est le flux vers le fichier, autrement dit la variable de type FILE qui contient l'adresse de votre fichier.
Pour les 2 programmes qui vont suivre, il est préférable de travailler dans le même répertoire, car nous allons créer un fichier dans ce répertoire, donc pour que la démonstration fonctionne, je vais partir du point que l'exécution de ces programmes se fait toujours depuis le même dossier.
Nous allons commencer par un programme qui va essayer d'ouvrir un fichier en lecture. Ce fichier n'existera pas, tapez donc :
Nous commençons donc par déclarer un pointeur de type FILE que l'on initialisera à NULL. Nous utilisons ensuite la fonctionfopen pour ouvrir le fichier fichier.txt en lecture (r). Etant donné que nous spécifions un chemin d'accès relatif, le programme cherche le fichier fichier.txt dans le répertoire courant. Nous récupérons donc l'adresse du fichier ouvert dans la variable fichier. Nous devons ensuite vérifier si cette variable n'est pas nulle, car si c'est le cas, cela voudrait dire que l'ouverture du fichier a échouée, nous afficherons donc un message. Si par contre, l'ouverture a réussie, nous l'affichons également et en plus, nous fermons le fichier ouvert. Nous ne le fermons pas quand l'ouverture à échouée car fermer un fichier dont l'adresse est à NULLprovoque une erreur d'exécution.
Le deuxième programme sera une amélioration du premier :
Comme vous le voyez, le début de ce programme est le même que le précédent. Nous essayons d'ouvrir le fichier fichier.txt en lecture et nous regardons si l'ouverture a réussie en vérifiant que le pointeur est bien différent de NULL, si ce n'est pas le cas, on indique à l'utilisateur qu'il a été impossible d'ouvrir le fichier et que nous allons donc le créer. Nous utilisons donc la fonctionfopen de la même manière, mais cette fois, nous passons comme deuxième argument w+, ainsi, le fichier s'ouvrira en lecture et écrire mais mieux, si il n'existe pas (et c'est le cas), il sera créé. Nous vérifions quand même si la création s'est bien passée en vérifiant que le pointeur est bien différent de NULL, si ce n'est pas le cas, on l'indique, sinon on indique à l'utilisateur que le fichier est bien créé et nous le fermons. Dans le cas où l'ouverture en r du début fonctionne, on affiche simplement un message et on ferme le fichier.
Si vous exécutez ce programme deux fois, vous verrez que la première fois, il vous affiche la phrase "Erreur a l'ouverture du fichier, celui-ci va être créé\n", mais pas la deuxième fois. C'est logique étant donné que la première fois, le fichier n'existe pas, le programme va donc utiliser fopen pour le créer et donc lorsque vous ré-exécuterez votre programme le fichier existera donc il entrera directement dans la partie de code informant l'utilisateur que le fichier a bien été ouvert.
Maintenant que vous savez ouvrir et fermer les fichiers, rendez vous dans les prochains cours pour apprendre comment lire, écrire, se déplacer et récupérer des informations intéressantes sur les fichiers.
Ouverture
Les fichiers sont en fait représentés sous forme de flux, comme stdin, stdout et stderr (sur lesquels il y a un cours dans la partie base). Sachez également que nous allons introduire ici le mot curseur. Le curseur est en fait le position à laquelle est le fichier. Si par exemple, vous avez un fichier qui contient le mot salut, si nous lisons ce mot et disons que le curseur se trouve après le mot salut, il se trouvera en position 5, car il sera derrière le mot. Le curseur est donc la position courante dans le fichier.
Pour ouvrir un fichier, il vous faut utiliser la fonction fopen qui se trouve dans la bibliothèque stdio.h. La syntaxe de cette fonction est la suivante :
- FILE *fopen (const char *path, const char *mode);
Comme vous le voyez cette fonction renvoie un pointeur de type FILE qui contiendra un pointeur vers le fichier ouvert, ce pointeur vaudra NULL si un problème est survenu lors de l'ouverture. Il ne faut pas inclure de bibliothèques spéciales pour le type FILE, celui-ci est déjà déclaré dans stdio.h.
Cette fonction prend deux paramètres, le premier, le plus logique est le chemin d'accès vers le fichier, celui-ci peut être absolu ou relatif (ex : absolu = c:abc.txt, relatif = c.txt). Le deuxième argument lui est la façon dont on ouvre le fichier, cet argument est simplement une chaine de caractères, voici les différentes possibilités :
r : r signifie read voulant ainsi dire que le fichier devra être ouvert uniquement en lecture et non en écriture. Quand vous utilisez ce mode, le curseur se placera au début du fichier.
r+ : La différence entre r et r+ est que le fichier sera ouvert en lecture ET en écriture, mais le curseur sera toujours placé au début du fichier.
w : Le fichier sera ici ouvert en écriture. Si le fichier n'existait pas, la fonction le crée, par contre si il existe, son contenu sera écrasé, donc votre fichier sera vide après l'appel à cette fonction si il contenait quelque chose. Le curseur est également positionné au début du fichier.
w+ : Vous pouvez également utiliser w+ pour ouvir le fichier en écriture ET en lecture. Si le fichier n'existait pas, la fonction le crée, par contre si il existe, son contenu sera écrasé, donc votre fichier sera vide après l'appel à cette fonction si il contenait quelque chose. Le curseur est également positionné au début du fichier.
a: Le fichier sera ici ouvert en ajout (donc il écrira à la fin du fichier). Si le fichier n'existait pas, la fonction le crée. Le curseur est par contre positionné à la fin du fichier.
a: Le fichier sera ici ouvert en ajout (donc il écrira à la fin du fichier) ET en lecture. Si le fichier n'existait pas, la fonction le crée. Le curseur sera positionné au début du fichier, mais lorsque vous écrirez dans le fichier, ce sera TOUJOURS à la suite du contenu de celui-ci.
Il y a assez avec ces 3 modes d'ouvertures pour faire ce que nous désirons mais souvenez vous d'une chose que l'on a souvent tendance à oublier. Si vous ouvrez votre fichier en a ou a+ et que vous tentez une écriture dedans, celle-ci se fera TOUJOURS à la fin du fichier, même si vous vous êtes déplacé dans le fichier.
Une autre subtilité est l'ajout du caractère b dans le mode d'ouverture. Effectivement, certains systèmes d'exploitation traite les fichiers binaires et les fichiers textes différemment, ajouter le b comme dernier caractère ou entre le caractère et le + vu ci dessus peut signaler au système d'exploitation que le fichier à exploiter est un fichier binaire. Personnelement, je vous conseille de le mettre pour assurer la compatibilité entre les systèmes lorsque vous désirez utiliser un fichier binaire, dans le cas contraire, ne le mettez pas, les formats deviennent donc :
ab, ab+, rb, rb+, wb, wb+
Fermeture
Une fois que vous avez ouvert un fichier, il vous faut le fermer, effectivement vous devez fermer un fichier pour la même raison que vous désallouez les pointeurs. La fonction de fermeture d'un fichier est très simple, sa syntaxe est la suivante :
- int fclose (FILE *fp);
Cette fonction renvoie 0 si elle réussit et le code de l'erreur dans le cas contraire (pour savoir que faire de ce code, rendez vous dans la partie gestion d'erreurs). L'argument que l'on doit passer à cette fonction est le flux vers le fichier, autrement dit la variable de type FILE qui contient l'adresse de votre fichier.
Applications
Pour les 2 programmes qui vont suivre, il est préférable de travailler dans le même répertoire, car nous allons créer un fichier dans ce répertoire, donc pour que la démonstration fonctionne, je vais partir du point que l'exécution de ces programmes se fait toujours depuis le même dossier.
Nous allons commencer par un programme qui va essayer d'ouvrir un fichier en lecture. Ce fichier n'existera pas, tapez donc :
- #include <stdio.h>
- int main() {
- FILE *fichier = NULL;
- fichier = fopen ("fichier.txt", "r");
- if (fichier == NULL)
- printf ("Erreur a l'ouverture du fichier\n");
- else {
- printf ("Fichier bien ouvert !\n");
- fclose(fichier);
- }
- return 0;
- }
Nous commençons donc par déclarer un pointeur de type FILE que l'on initialisera à NULL. Nous utilisons ensuite la fonctionfopen pour ouvrir le fichier fichier.txt en lecture (r). Etant donné que nous spécifions un chemin d'accès relatif, le programme cherche le fichier fichier.txt dans le répertoire courant. Nous récupérons donc l'adresse du fichier ouvert dans la variable fichier. Nous devons ensuite vérifier si cette variable n'est pas nulle, car si c'est le cas, cela voudrait dire que l'ouverture du fichier a échouée, nous afficherons donc un message. Si par contre, l'ouverture a réussie, nous l'affichons également et en plus, nous fermons le fichier ouvert. Nous ne le fermons pas quand l'ouverture à échouée car fermer un fichier dont l'adresse est à NULLprovoque une erreur d'exécution.
Le deuxième programme sera une amélioration du premier :
- #include <stdio.h>
- int main() {
- FILE *fichier = NULL;
- fichier = fopen ("fichier.txt", "r");
- if (fichier == NULL) {
- printf ("Erreur a l'ouverture du fichier, celui-ci va être créé\n");
- fichier = fopen ("fichier.txt", "w+");
- if (fichier == NULL)
- printf ("Impossible de créer le fichier !\n");
- else {
- printf ("Fichier créé et ouvert avec succès !\n");
- fclose(fichier);
- }
- }
- else {
- printf ("Fichier bien ouvert !\n");
- fclose(fichier);
- }
- return 0;
- }
Comme vous le voyez, le début de ce programme est le même que le précédent. Nous essayons d'ouvrir le fichier fichier.txt en lecture et nous regardons si l'ouverture a réussie en vérifiant que le pointeur est bien différent de NULL, si ce n'est pas le cas, on indique à l'utilisateur qu'il a été impossible d'ouvrir le fichier et que nous allons donc le créer. Nous utilisons donc la fonctionfopen de la même manière, mais cette fois, nous passons comme deuxième argument w+, ainsi, le fichier s'ouvrira en lecture et écrire mais mieux, si il n'existe pas (et c'est le cas), il sera créé. Nous vérifions quand même si la création s'est bien passée en vérifiant que le pointeur est bien différent de NULL, si ce n'est pas le cas, on l'indique, sinon on indique à l'utilisateur que le fichier est bien créé et nous le fermons. Dans le cas où l'ouverture en r du début fonctionne, on affiche simplement un message et on ferme le fichier.
Si vous exécutez ce programme deux fois, vous verrez que la première fois, il vous affiche la phrase "Erreur a l'ouverture du fichier, celui-ci va être créé\n", mais pas la deuxième fois. C'est logique étant donné que la première fois, le fichier n'existe pas, le programme va donc utiliser fopen pour le créer et donc lorsque vous ré-exécuterez votre programme le fichier existera donc il entrera directement dans la partie de code informant l'utilisateur que le fichier a bien été ouvert.
Maintenant que vous savez ouvrir et fermer les fichiers, rendez vous dans les prochains cours pour apprendre comment lire, écrire, se déplacer et récupérer des informations intéressantes sur les fichiers.
0 comments:
Post a Comment