Les fichiers
Précédemment nous avons donné des informations par deux sources
- Soit la structure du programme
- Soit par l'utilisateur du programme (scanf, fgets, ... par exemple)
Si je devais enregistrer des données de manière permanente, les deux solutions ci-dessus ne semblent pas nous arranger, on a donc comme autre solution, l'enregistrement de ces données dans un fichier.
En algorithmie un fichier à traiter, doit être structuré et sont souvent délimité par des caractères connus à l'avance comme le point-virgule, la virgule, l'espace, ...
Ce genre de fichier pourra être analysé et modifié sans grande difficulté en enregistrant et en le mettant à jour.
Hors algorithmie, se sont de simples fichiers textes que l'on utilisera pour lire et l'analyser statistiquement, mais pas pour enregistrer une quelconque donnée.
Vous aurez compris que le réel intérêt du fichier texte, est bien de le lire, de le modifier et surtout de réenregistrer, mettre à jour les données.
Déclarer et initialiser le type FILE
FILE ? Qu'est-ce ? C'est une structure, souvenez-vous, une structure est un tableau contenant des informations sur l'objet, dans notre cas le fichier.
Comment se déclare ce type ?
Très simple, enfin presque...
Code:
FILE *f = NULL;
Très bonne question, en fait on a utiliser le mot clé typedef pour donner un synonyme et éviter de se coltiner le mot clé struct à chaque déclaration de variable.
FILE *f, veut dire que l'on crée une variable nommée f, contenant l'adresse (et non la valeur) de la structure FILE, ici NULL.
Ouvrir et fermer un fichier texte
Pour ouvrir un fichier texte, on utilisera la fonction fopen, et comme vous pouvez le voir dans la documentation, son prototype est :
Code:
FILE * fopen ( const char * filename, const char * mode );
Cette fonction prend aussi deux paramètres
- Le chemin du fichier sous forme de chaîne de caractères
- Le mode sous forme de chaîne de caractères qui prendra dans notre cas les valeurs "r", "w" et "a"
Les modes:
- "r" pour le mode de lecture
- "rb" pour le mode de lecture fichier binaire
- "w" pour le mode d'écriture fichier, le fichier sera écrasé si existant, sinon créé et écris
- "wb" pour le mode d'écriture fichier binaire, le fichier sera écrasé si existant, sinon créé et écris
- "a" pour le mode ajout, permet d'ajouter en fin de fichier, les caractères, chaînes de caractères, ...
- "ab" idem que le mode "a", pour les fichiers binaires
Revenons à nos moutons, pour ouvrir un fichier on utilise la fonction fopen et on va vérifier que ce fichier est bien ouvert en vérifiant que l'adresse de retour n'a pas pour valeur NULL, en code ça donne ceci
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "r"); if (f != NULL) puts("fichier ouvert !"); /* Affiche 'fichier ouvert' si fopen à réussi */ return 0; }
Donc notre code sera final et correct sera celui ci-dessous en utilisant la fonction fclose (vous l'aurez deviné) dont le prototype est le suivant:
Code:
int fclose ( FILE * stream );
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "r"); if (f != NULL) { puts("fichier ouvert !"); fclose(f); puts("fichier fermé !"); } return 0; }
Lire un fichier texte
Pour lire un fichier, on aura deux solutions, soit lire
Évidemment tout cela va dépendre de vos besoins, mais si c'est pour détecter le caractère de fin de ligne '\n', autant choisir la fonction fgets.
Voici le code simple pour lire un fichier texte entièrement sur la console
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "r"); char line[200]; char *p = NULL; if (f == NULL) { puts("impossible d'ouvrir le fichier"); return -1; } p = fgets(line, sizeof line, f); while (p != NULL) { printf("%s", line); p = fgets(line, sizeof line, f); } fclose(f); return 0; }
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "r"); char c; if (f == NULL) { puts("impossible d'ouvrir le fichier"); return -1; } c = fgetc(f); while (c != EOF) { putchar(c); c = fgetc(f); } fclose(f); return 0; }
Écrire dans un fichier texte
Pour écrire dans un fichier, on a deux modes
- Le mode "w"
- Le mode "a"
Nous utiliserons le mode "w" pour créer un nouveau fichier et écrire dedans.
La fonction utile pour écrire est la fonction fputs, dont le prototype est le suivant:
Code:
int fputs ( const char * str, FILE * stream );
- une chaîne de caractères
- une adresse sur structure type FILE
Voici un exemple simple:
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "w"); const char *line = "Bonjour ça va ?"; if (f == NULL) { puts("impossible d'ouvrir le fichier"); return -1; } fputs(line, f); /* écriture du contenu de la variable line dans f */ fclose(f); return 0; }
Pour écrire un seul caractère, nous utiliserons la fonction fputc, dont le prototype est le suivant :
Code:
int fputc ( int character, FILE * stream );
Code:
#include <stdio.h> int main(void) { FILE *f = fopen("test.txt", "w"); const char *line = "Bonjour ça va ?"; int i; if (f == NULL) { puts("impossible d'ouvrir le fichier"); return -1; } for (i=0; line[i] != '\0'; i++) fputc(line[i], f); /* écriture caractère par caractère dans le fichier */ fclose(f); return 0; }
Considérons cette ligne: Je;suis;hackadémicien;et;fier;de;l'être dans un fichier texte, nommé test.txt
On vous demande de réécrire cette ligne dans le même fichier, en la modifiant sous cette forme: Je suis hackadémicien et fier de l'être
Cela impose que la ligne de départ n'existe plus et est remplacée par cette dernière (remplacement des points-virgules par des espaces)
Merci de m'avoir lu et à bientôt pour le prochain cours
Commentaire