Les fichiers en langage C

@joekakone

Joseph Konka @joekakone

03/03/2026 · 7 min

Comprenez les mécanismes d'entrées/sorties persistantes en langage C. Découvrez le concept de flux (streams), la structure FILE, les modes d'ouverture et les bonnes pratiques de gestion des fichiers sur disque.

Les fichiers en langage C#

Jusqu'à présent, toutes les données manipulées par nos programmes résidaient exclusivement dans la mémoire vive (RAM). Cette mémoire présente deux caractéristiques majeures : 1. Elle offre des vitesses d'accès extrêmement rapides. 2. Elle est volatile : dès que le programme se termine ou que l'ordinateur s'éteint, l'intégralité des données en RAM est irrémédiablement perdue.

Pour conserver des informations d'une exécution à l'autre — qu'il s'agisse d'un registre d'étudiants, d'un historique de transactions financières ou des paramètres de configuration d'un logiciel —, il est indispensable de stocker ces données sur un support de stockage secondaire non volatil (disque dur, SSD, clé USB). C'est le rôle fondamental des fichiers.


1. La notion de flux (stream) en C#

En langage C, le système d'exploitation et la bibliothèque standard <stdio.h> masquent la complexité physique du disque dur en modélisant chaque fichier sous la forme d'un flux de données (stream).

Un flux est une suite séquentielle d'octets. Il existe deux grands types de flux :

Type de flux Description Exemples d'usage
Flux texte Suite de caractères ASCII/UTF-8 découpée en lignes terminées par un caractère de fin de ligne (\n). Les caractères spéciaux peuvent subir une conversion selon le système (ex. \r\n sous Windows vers \n). Fichiers de configuration, fichiers .txt, fichiers .csv.
Flux binaire Suite brute d'octets (0 et 1) exactement identique à l'organisation des données en mémoire vive. Aucune transformation n'est effectuée. Images (.png, .jpg), exécutables, archives (.zip), bases de données .dat.
flowchart LR
    A[Programme C en RAM] <-->|Stream / Flux séquentiel| B[Tampon Buffer en mémoire]
    B <-->|Appels système OS| C[Fichier physique sur Disque HDD / SSD]

La structure FILE#

Dans la bibliothèque <stdio.h>, toute opération sur un fichier s'effectue via un pointeur vers une structure opaque nommée FILE :

FILE *mon_fichier = NULL;

Ce pointeur contient l'état interne de la communication avec le fichier : la position courante du curseur de lecture/écriture, les tampons de mémoire tampon (buffers) associés et les indicateurs d'erreur ou de fin de fichier (EOF).


2. Les flux standards préexistants#

Dès le lancement d'un programme en C, le système ouvre automatiquement trois flux standards sans qu'aucune action de votre part ne soit requise :

  1. stdin (Standard Input) : flux d'entrée par défaut, généralement associé au clavier (scanf, getchar, fgets(..., stdin)).
  2. stdout (Standard Output) : flux de sortie par défaut, généralement associé à l'écran de la console (printf, putchar, puts).
  3. stderr (Standard Error) : flux dédié aux messages d'erreur et alertes, également dirigé vers l'écran mais non bufferisé, garantissant un affichage immédiat en cas de panne.

3. Le cycle de vie d'un fichier#

Toute manipulation de fichier en C respecte rigoureusement une séquence en quatre étapes :

sequenceDiagram
    participant P as Programme C
    participant S as Système / stdio
    participant D as Disque
    P->>S: 1. fopen("data.txt", "r")
    S->>D: Localisation et ouverture
    S-->>P: Retourne FILE* (ou NULL si échec)
    Note over P: 2. Vérification obligatoire (!= NULL)
    P->>S: 3. Lecture / Écriture (fgets, fprintf, ...)
    S->>D: Transfert de blocs d'octets
    P->>S: 4. fclose(mon_fichier)
    S->>D: Vidage du buffer (flush) et fermeture
  1. Déclaration : FILE *fichier = NULL;
  2. Ouverture : fichier = fopen(chemin, mode);
  3. Vérification : s'assurer impérativement que fichier != NULL.
  4. Traitement : lecture ou écriture séquentielle / directe.
  5. Fermeture : fclose(fichier); pour forcer l'écriture physique des tampons et libérer le descripteur de fichier auprès du système d'exploitation.

4. Les modes d'ouverture de fichiers#

Le second argument de la fonction fopen() détermine l'opération autorisée et le comportement face à un fichier existant :

Mode texte Mode binaire Description Si le fichier existe Si le fichier n'existe pas
"r" "rb" Lecture seule (Read) Ouvre le fichier au début Échec : retourne NULL
"w" "wb" Écriture seule (Write) Écrase et vide tout le contenu Crée le fichier
"a" "ab" Ajout (Append) Ouvre et place le curseur à la fin Crée le fichier
"r+" "r+b" ou "rb+" Lecture et écriture Ouvre au début sans écraser Échec : retourne NULL
"w+" "w+b" ou "wb+" Lecture et écriture avec réinitialisation Écrase et vide le contenu Crée le fichier
"a+" "a+b" ou "ab+" Lecture et ajout Ouvre, écrit toujours à la fin Crée le fichier

[!WARNING] Le mode "w" écrase instantanément et silencieusement le fichier ciblé sans demander confirmation ! Si le fichier contenait des données critiques, elles seront définitivement effacées dès l'appel à fopen().


5. Programme minimal de démonstration#

Voici le squelette standard que vous devez maîtriser pour tout programme manipulant des fichiers :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const char *nom_fichier = "journal.txt";

    // 1. Ouverture en mode écriture (création ou écrasement)
    FILE *fichier = fopen(nom_fichier, "w");

    // 2. Vérification obligatoire de l'ouverture
    if (fichier == NULL)
    {
        perror("Erreur critique lors de l'ouverture du fichier");
        return EXIT_FAILURE;
    }

    // 3. Opération d'écriture
    fprintf(fichier, "Plateforme AlgoJungle - Module Langage C\n");
    fprintf(fichier, "Gestion de la persistance des donnees sur disque.\n");

    // 4. Fermeture impérative
    fclose(fichier);
    fichier = NULL; // Évite les pointeurs sauvages (dangling pointers)

    printf("Donnees ecrites avec succes dans '%s'.\n", nom_fichier);
    return EXIT_SUCCESS;
}

6. Feuille de route du module#

Dans les chapitres suivants de cette partie, vous apprendrez à maîtriser : - Lecture et écriture de fichiers texte : manipulation caractère par caractère (fgetc, fputc), ligne par ligne (fgets, fputs) et formatée (fprintf, fscanf). - Traitement des fichiers CSV : extraction, découpage de colonnes et export de données tabulaires pour vos analyses de données. - Fichiers binaires et accès direct : sérialisation directe de structures avec fread et fwrite, et navigation aléatoire dans le fichier avec fseek et ftell. - Applications concrètes : conception d'un journal applicatif (logger), d'un outil de traitement par lots et d'un inventaire persistant sur disque.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue