Traitements de base sur les fichiers en C

30 Aug 2019 30 Aug 2019 7527 vues ESSADDOUKI Mostafa 7 min de lecture

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>.

Pourquoi utiliser des fichiers ?
  1. Persistance — les données survivent à la fin du programme
  2. Volumétrie — traiter de grands jeux de données sans saisie manuelle
  3. Portabilité — transférer des données entre machines sans modification
  4. Partage — échanger des résultats entre plusieurs programmes

1. Types de fichiers

CritèreFichier texteFichier binaire
StockageCodes ASCII, lignes terminées par '\n'Représentation mémoire brute (octets)
LisibilitéLisible dans un éditeur de texteNon lisible directement
TaillePlus grande (encodage texte)Plus compacte
SécuritéModifiable facilementPlus 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"
Portabilité des fichiers texte Un fichier texte créé sous Windows peut être ouvert sous Linux sans problème — les codes ASCII sont universels. En revanche, un fichier binaire peut être non portable car la taille des types (int sur 2 ou 4 octets) et l'ordre des octets (little-endian / big-endian) varient selon l'architecture.

2. Mémoire tampon (buffer)

Buffer — Mémoire tampon Le buffer est une zone mémoire temporaire utilisée par les fonctions d'E/S pour regrouper les lectures/écritures et réduire le nombre d'accès disque (lents). Les données sont d'abord accumulées dans le buffer puis écrites sur disque en une seule opération (flush) quand il est plein ou quand le fichier est fermé.

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énementAction sur le buffer
Buffer pleinÉcriture automatique sur disque
Appel à fclose()Flush du buffer restant + fermeture
Appel à fflush(f)Flush manuel forcé
Attention — Ne pas oublier 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 * — Pointeur de fichier 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.

Syntaxe — fopen() C
#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

ModeSignificationFichier inexistantFichier existantLectureÉcriture
"r"Lecture seuleErreur (NULL)InchangéOuiNon
"w"Écriture seuleCrééÉcrasé (vide)NonOui
"a"Ajout en finCrééAjout en finNonOui (fin)
"r+"Lecture + écriture (mise à jour)Erreur (NULL)InchangéOuiOui
"w+"Écriture + lectureCrééÉcrasé (vide)OuiOui
"a+"Ajout + lectureCrééAjout en finOuiOui (fin)

Pour ouvrir un fichier en mode binaire, ajouter b au mode : "rb", "wb", "ab", "rb+", "wb+", "ab+".

Danger — Mode "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é */
Le mode est une chaîne — guillemets doubles obligatoires
fopen("fichier.txt", 'r');   /* Erreur — apostrophes = caractère */
fopen("fichier.txt", "r");   /* Correct — guillemets = chaîne    */

4. Fermer un fichier — fclose()


Syntaxe — fclose() C
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.


Patron standard C
#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;
}
Sortie console + contenu de etudiants.txt
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;
}
Sortie
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;
}
Contenu de etudiants.txt après exécution
Mostafa 23
Ismail  20
Dounia  22
Youssef 21
Astuce — 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émentDescriptionPoint clé
FILE *Pointeur de fichierUnique interface de communication avec le fichier
fopen()Ouverture du fichierRetourne NULL en cas d'erreur — toujours vérifier
"r"Lecture seuleFichier doit exister — contenu inchangé
"w"Écriture (crée ou écrase)Efface le contenu existant !
"a"Ajout en finContenu existant préservé
+ bMode binaireAjouter b au mode : "rb", "wb"
BufferZone tampon automatiqueVidé à fclose() ou fflush()
fclose()Fermeture du fichierObligatoire — 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.