Fichiers en C
Les variables et tableaux stockent des données en mémoire vive — elles sont perdues à la fin du programme. Les fichiers permettent de persister les données sur disque entre deux exécutions. En C, toutes les fonctions de manipulation de fichiers sont définies dans <stdio.h>.
- Persistance — les données survivent à la fin du programme
- Volumétrie — traiter de grands jeux de données sans saisie manuelle
- Portabilité — transférer des données entre machines sans modification
- Partage — échanger des résultats entre plusieurs programmes
1. Types de fichiers
| Critère | Fichier texte | Fichier binaire |
|---|---|---|
| Stockage | Codes ASCII, lignes terminées par '\n' | Représentation mémoire brute (octets) |
| Lisibilité | Lisible dans un éditeur de texte | Non lisible directement |
| Taille | Plus grande (encodage texte) | Plus compacte |
| Sécurité | Modifiable facilement | Plus difficile à modifier |
| Portabilité | Portable (Windows ↔ Linux) | Dépend de l'architecture (endianness, tailles) |
| Extensions courantes | .txt, .csv, .c | .bin, .dat, .exe |
| Mode d'ouverture | "r", "w", "a"… | "rb", "wb", "ab"… |
int sur 2 ou 4 octets) et l'ordre des octets (little-endian / big-endian) varient selon l'architecture.2. Mémoire tampon (buffer)
Le buffer est créé et géré automatiquement par le système dès l'ouverture d'un fichier. Il est vidé (flushed) dans trois situations :
| Événement | Action sur le buffer |
|---|---|
| Buffer plein | Écriture automatique sur disque |
Appel à fclose() | Flush du buffer restant + fermeture |
Appel à fflush(f) | Flush manuel forcé |
fclose() Si le programme se termine sans appeler fclose(), les données encore dans le buffer peuvent ne pas être écrites sur disque — entraînant une perte partielle ou totale des données. Toujours fermer les fichiers explicitement.3. Ouvrir un fichier — fopen()
FILE est une structure définie dans <stdio.h> qui stocke les informations d'un fichier ouvert (nom, position courante, taille du buffer, indicateurs d'erreur/EOF…). On manipule toujours un fichier via un pointeur FILE * — jamais directement.#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);
/* Retourne un pointeur FILE valide en cas de succès
Retourne NULL en cas d'erreur (fichier inexistant, permissions…) */Modes d'ouverture
| Mode | Signification | Fichier inexistant | Fichier existant | Lecture | Écriture |
|---|---|---|---|---|---|
"r" | Lecture seule | Erreur (NULL) | Inchangé | Oui | Non |
"w" | Écriture seule | Créé | Écrasé (vide) | Non | Oui |
"a" | Ajout en fin | Créé | Ajout en fin | Non | Oui (fin) |
"r+" | Lecture + écriture (mise à jour) | Erreur (NULL) | Inchangé | Oui | Oui |
"w+" | Écriture + lecture | Créé | Écrasé (vide) | Oui | Oui |
"a+" | Ajout + lecture | Créé | Ajout en fin | Oui | Oui (fin) |
Pour ouvrir un fichier en mode binaire, ajouter b au mode : "rb", "wb", "ab", "rb+", "wb+", "ab+".
"w" écrase le fichier existant Ouvrir un fichier existant avec "w" le vide immédiatement et irréversiblement avant toute écriture. Utiliser "a" pour conserver le contenu existant et ajouter à la fin, ou "r+"pour modifier sans effacer :fopen("data.txt", "w"); /* efface tout le contenu existant ! */
fopen("data.txt", "a"); /* ajoute à la fin — contenu préservé */
fopen("data.txt", "r+"); /* lecture/écriture — contenu préservé */fopen("fichier.txt", 'r'); /* Erreur — apostrophes = caractère */
fopen("fichier.txt", "r"); /* Correct — guillemets = chaîne */4. Fermer un fichier — fclose()
int fclose(FILE *f);
/* Retourne 0 en cas de succès, EOF en cas d'erreur */fclose() accomplit trois actions dans l'ordre : vide le buffer restant sur disque, libère les ressources système associées au fichier et invalide le pointeur FILE *.
5. Patron complet d'ouverture / traitement / fermeture
Toute manipulation de fichier suit ce schéma en trois étapes : ouvrir avec vérification, traiter, fermer.
#include <stdio.h>
#include <stdlib.h>
FILE *f;
/* 1 — Ouverture */
f = fopen("nomFichier.txt", "r");
if (f == NULL) {
perror("Erreur d'ouverture"); /* affiche le message système */
exit(1);
}
/* 2 — Traitement (lecture / écriture) */
/* ... */
/* 3 — Fermeture */
fclose(f);
f = NULL;Exemple n°1 — Ouvrir, écrire et fermer un fichier texte
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f = fopen("etudiants.txt", "w");
if (f == NULL) {
perror("Impossible d'ouvrir etudiants.txt");
exit(1);
}
fprintf(f, "Mostafa 23\n");
fprintf(f, "Ismail 20\n");
fprintf(f, "Dounia 22\n");
fclose(f);
f = NULL;
printf("Fichier écrit avec succès.\n");
return 0;
}Fichier écrit avec succès. --- etudiants.txt --- Mostafa 23 Ismail 20 Dounia 22
Exemple n°2 — Ouvrir et lire un fichier texte ligne par ligne
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f = fopen("etudiants.txt", "r");
if (f == NULL) {
perror("Impossible d'ouvrir etudiants.txt");
exit(1);
}
char ligne[100];
int num = 1;
printf("Contenu du fichier :\n");
while (fgets(ligne, sizeof(ligne), f) != NULL) {
printf("Ligne %d : %s", num++, ligne);
}
fclose(f);
f = NULL;
return 0;
}Contenu du fichier : Ligne 1 : Mostafa 23 Ligne 2 : Ismail 20 Ligne 3 : Dounia 22
Exemple n°3 — Mode ajout ("a")
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f = fopen("etudiants.txt", "a");
if (f == NULL) { perror("Erreur"); exit(1); }
fprintf(f, "Youssef 21\n"); /* ajouté en fin — contenu existant préservé */
fclose(f);
printf("Étudiant ajouté.\n");
return 0;
}Mostafa 23 Ismail 20 Dounia 22 Youssef 21
perror() vs printf() pour les erreurs perror("message") affiche automatiquement la description système de l'erreur (ex. "No such file or directory") en plus du message personnalisé. C'est plus informatif que printf("Erreur\n")seul :/* Affiche : "Ouverture : No such file or directory" */
FILE *f = fopen("inexistant.txt", "r");
if (f == NULL) {
perror("Ouverture");
exit(1);
}Récapitulatif
| Élément | Description | Point clé |
|---|---|---|
FILE * | Pointeur de fichier | Unique interface de communication avec le fichier |
fopen() | Ouverture du fichier | Retourne NULL en cas d'erreur — toujours vérifier |
"r" | Lecture seule | Fichier doit exister — contenu inchangé |
"w" | Écriture (crée ou écrase) | Efface le contenu existant ! |
"a" | Ajout en fin | Contenu existant préservé |
+ b | Mode binaire | Ajouter b au mode : "rb", "wb"… |
| Buffer | Zone tampon automatique | Vidé à fclose() ou fflush() |
fclose() | Fermeture du fichier | Obligatoire — vide le buffer et libère les ressources |
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.