-
maxence.montavon authoredmaxence.montavon authored
title: Base VII
date: 2020-11-11
Les fichier en C
-
Un fichier en C est représenté par un pointeur de fichier.
#include <stdio.h> FILE *fp;
-
FILE *
{.C} est une structure de donnée opaque contenant les informations sur l'état du fichier. -
Il est manipulé à l'aide de fonctions dédiées.
-
Le pointeur de fichier est toujours passé par référence.
Manipulations de fichier
- Pour lire/écrire dans un fichier il faut toujours effectuer trois étapes:
- Ouvrir le fichier (
fopen()
{.C}). - Écrire/lire dans le fichier (
fgets()
{.C},fputs()
{.C},fread()
{.C},fwrite()
{.C}, ...). - Fermer le fichier (
fclose()
{.C}).
- Ouvrir le fichier (
- Nous allons voir brièvement ces trois étapes.
Ouverture d'un fichier
-
L'ouverture d'un fichier se fait avec la fonction
fopen()
{.C}FILE *fp = fopen(filename, mode);
-
filename
{.C} est une chaîne de caractères (incluant le chemin). -
mode
{.C} est le mode d'ouverture ("r"
{.C},"w"
{.C}, ... voirman 3 fopen
{.bash}) qui est une chaîne de caractères. -
Si l'ouverture échoue (pas la bonne permission, ou n'existe pas)
fopen()
{.C} retourne0
. -
Toujours tester le retour de
fopen()
{.C}if (NULL == fp) { fprintf(stderr, "Can't open output file %s!\n", filename); // affiche dans le canal d'erreur exit(RETURN_FAILURE); }
Fermeture d'un fichier
-
Il faut toujours fermer un fichier à l'aide de
fclose()
{.C}FILE *fp = fopen("mon_fichier", "w"); // écritures diverses fclose(fp);
-
Les données sont transférées dans une mémoire tampon, puis dans le disques.
-
Si la mémoire tampon est pleine, le fichier est fermé, ... les données sont écrites sur le disque.
-
Si la mémoire tampon contient encore des données à la fin du programme les données sont perdues.
Lecture d'un fichier (1/2)
char *fgets(char *s, int size, FILE *stream)
- Lit une ligne de taille d'au plus
size-1
et la stocke danss
, depuisstream
. - Retourne
s
ouNULL
si échoue.
FILE *fp = fopen("text.txt", "r");
char buffer[100];
fgets(buffer, 37, fp);
// lit 36 caractères au plus et les écrit dans buffer
// s'arrête si rencontre EOF, ou "\n".
// ajoute un "\0" terminal
fclose(fp);
Lecture d'un fichier (2/2)
size_t fread(void *ptr, size_t size, size_t nmemb,
FILE *stream)
-
Lit
nmemb
éléments de taillesize
octets et les écrit à l'adresseptr
dans le fichierstream
. -
Retourne le nombre d'éléments lus.
FILE *fp = fopen("doubles.bin", "rb"); double buffer[100]; size_t num = fread(buffer, sizeof(double), 4, fp); // lit 4 double, se trouvant à l'adresse // buffer dans le fichier fp au format binaire // retourne 4 fclose(fp);
Écriture dans un fichier (1/2)
int fprintf(FILE *stream, const char *format, ...)
-
Écrit la chaîne de caractères
format
dans le fichier stream. -
format
a la même syntaxe que pourprintf()
. -
Retourne le nombre de caractères écrit sans le
\0
terminal(si réussite).FILE *fp = fopen("text.txt", "w"); fprintf(fp, "Hello world! We are in %d\n", 2020); // Écrit "Hello world! We are in 2020" // dans le fichier fp fclose(fp);
Écriture dans un fichier (2/2)
size_t fwrite(const void *ptr, size_t size,
size_t nmemb, FILE *stream)
-
Écrit
nmemb
éléments de taillesize
octets se trouvant à l'adresseptr
dans le fichierstream
. -
Retourne le nombre d'éléments écrits.
FILE *fp = fopen("doubles.bin", "wb"); double buffer[] = {1.0, 2.0, 3.0, 7.0}; size_t num = fwrite(buffer, sizeof(double), 4, fp); // écrit 4 double, se trouvant à l'adresse // buffer dans le fichier fp au format binaire // retourne 4 fclose(fp);
Les pointeurs de fichiers spéciaux
-
Il existe trois
FILE *
{.C} qui existent pour tout programme:-
stdin
{.C}: l'entrée standard. -
stdout
{.C}: la sortie standard. -
stderr
{.C}: l'erreur standard.
-
-
Lors d'un fonctionnement dans le terminal:
- l'entrée standard est le clavier
- la sortie et erreur standard sont affichés dans le terminal.
-
Ainsi on a
fprintf(stdout, "texte\n"); // == printf("texte\n"); int a; fscanf(stdin, "%d", &a); // == scanf("%d", &a);