Programmation bas niveau (BNV) Help

Cours : La manipulation des fichiers

Un peu de théorie

Dans un ordinateur, les fichiers sont stockés dans le disque dur, soit la mémoire très lente, mais persistante d'un ordinateur. Contrairement à la mémoire vive très rapide, mais qui est réinitialisée régulièrement.

Comme le disque dur est une mémoire lente, il serait très peu pratique de devoir l'interroger à chaque fois que l'on veut faire la moindre opération sur un fichier.

On utilise donc un système que l'on appelle la bufferisation. À l'ouverture du fichier, celui-ci est placé dans la RAM, et lorsque vous sauvegardez son état à ce moment précis est renvoyé sur le disque dur.

En C pour permettre cette bufferisation, on manipule ce que l'on appelle des flux (le flux est en gros votre fichier bufferisé dans la RAM) auxquels on accède via un type de pointeur un peu spécial.

Les fonctions de manipulation de fichiers étant de la fgestion d'entrées et sorties elles sont comprises dans une librairie que vous utilisez déjà : stdio.h, celle de scanf() et printf().

fopen : Ouvrir un fichier

Pour ouvrir un fichier, on utilisera la fonction fopen dont voici le prototype :

FILE *fopen(char *path, char *mode);

Son retour est donc un FILE * le pointeur un peu spécial dont on parlait plus haut.

Elle a besoin de connaitre le path du fichier que vous voulez ouvrir ainsi que le mode d'ouverture :

Les modes de fopen

Mode

Opérations

Effets supplémentaires

r

Lecture

Rien

r+

Lecture & écriture

Rien

w

Écriture

Si le fichier n'existe pas : le créé.
Si le fichier existe : efface le contenu

w+

Lecture & écriture

Si le fichier n'existe pas : le créé.
Si le fichier existe : efface le contenu

a

Écriture

Si le fichier n'existe pas : le créé.
Si le fichier existe : place le contenu à la fin du fichier

a+

Lecture & Écriture

Si le fichier n'existe pas : le créé.
Si le fichier existe : place le contenu à la fin du fichier

Exemples d'utilisation

Lire et remplacer

Je veux remplacer le contenu du fichier s'il existe et le créer sinon. Je veux pouvoir lire et écrire dedans :

#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("texte.txt", "w+"); if (fp == NULL) { printf("Le fichier texte.txt n'a pas pu être ouvert\n"); return EXIT_FAILURE; } printf("Le fichier texte.txt existe\n"); return 0; }

Lire et compléter

Je veux ajouter du contenu à un fichier s'il existe et le créer sinon. Je veux pouvoir lire et écrire dedans :

#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("texte.txt", "a+"); if (fp == NULL) { printf("Le fichier texte.txt n'a pas pu être ouvert\n"); return EXIT_FAILURE; } printf("Le fichier texte.txt existe\n"); return 0; }

fclose : fermer le fichier

Une fois que vous avec fini vos manipulations sur le fichier, il faut fermer le flux. Cela permet de stopper la bufferisation, libérer de la RAM et renvoyer tranquillement votre fichier dans le disque dur.

int fclose(FILE *flux);

Passez simplement à fclose le FILE * que vous aviez récupéré avec fopen.

fprintf : Écrire dans un fichier

La fonction fprintf s'utilise exactement comme printf à une différence près : on lui transmet le pointeur sur le flux sur lequel on veut écrire :

#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("texte.txt", "a+"); char * name = "Hugues"; if (fp == NULL) { printf("Le fichier texte.txt n'a pas pu être ouvert\n"); return EXIT_FAILURE; } fprintf(fp, "Mon nom est %s\n", name); fclose(fp); return 0; }

fgets : Lire les lignes d'un fichier

Pour lire le contenu d'un fichier, il nous faudrait connaitre sa taille pour dire "récupère-moi tant de caractères dans ce fichier" mais ça n'est pas souvent le cas. Du coup généralement on fait une boucle en utilisant la fonction fgets.

Pour vous éviter de la torture des méninges voilà le code que vous pouvez utiliser :

#include <stdio.h> #include <stdlib.h> #include <string.h> char * get_file(FILE * fp) { char * content; char buffer[10]; content = malloc(sizeof(char)); content[0] = '\0'; while(fgets(buffer, 10, fp) != NULL) { content = realloc(content, (strlen(buffer) * sizeof(char)) + strlen(content) * sizeof(char)); content = strcat(content, buffer); } return content; } int main() { FILE *fp = fopen("test.txt", "r"); char * file_content; if (fp == NULL) { printf("Le fichier test.txt n'a pas pu être ouvert\n"); return EXIT_FAILURE; } file_content = get_file(fp); printf("%s", file_content); fclose(fp); return 0; }
29 September 2025