Académique Documents
Professionnel Documents
Culture Documents
Introduction
En C, les communications d'un programme avec son environnement se font par l'intermédiaire de
fichiers. Pour le programmeur, tous les périphériques, même le clavier et l'écran, sont des fichiers.
Jusqu'ici, nos programmes ont lu leurs données dans le fichier d'entrée standard, (c.-à-d.: le clavier)
et ils ont écrit leurs résultats dans le fichier de sortie standard (c.-à-d.: l'écran). Nous allons voir dans
ce chapitre, comment nous pouvons créer, lire et modifier nous-mêmes des fichiers sur disque.
I. Types de fichiers
Un fichier est un ensemble structuré de données stocké en général sur un support externe
(disquette, disque dur, disque optique, bande magnétique, ...).
1. Fichier texte
• Un fichier texte est une suite de caractères stockés avec leur code ASCII
o Les programmes source du langage C, par exemple, sont des fichiers texte.
• Un fichier texte est divisé en lignes qui se terminent par le caractère de retour à la ligne ‘\n’.
• Lisible : un fichier texte peut être créé ou consulté par l'utilisateur à l'aide d'un éditeur de texte
ou un programme.
2. Fichier binaire
• Tout ce qui n’est pas un fichier texte est un fichier binaire
• Un fichier binaire peut contenir toute sorte d’information y compris les données texte
• Un fichier binaire est une suite d’octets les uns derrière les autres sans aucune interprétation
o les caractères de contrôle (‘\n’, ‘\r’, etc) se sont pas interprétés
• Les données ne peuvent pas être lues/écrites que par programme.
• La taille du fichier est optimale (plus petite qu’un fichier texte) et les données sont facilement
lues/écrites en peu d’instructions.
3. Exemple
On écrit la suite des données suivantes, séparées par un espace, dans un fichier texte essai.txt et un
fichier binaire essai.bin
• ouvrir le fichier (fonction fopen) ; on indique le nom du fichier et les détails de l'accès envisagé.
• lire ou écrire dans le fichier : on utilise les fonctions autorisées par l'accès choisi (binaire ou
texte).
• fermer le fichier (fonction fclose).
Exemple :
Sous Windows, C:\data\liste.txt est un fichier qui se trouve dans le répertoire data .
Attention, en C le ‘\’ est un caractère spécial, il faut le déspécialiser. Ainsi dans le programme pour
définir une variable qui représente le nom du fichier on doit écrire ’\\’ :
Exemple :
Cette fonction :
Remarque :
Si non veut ouvrir le fichier en mode binaire, il faut ajouter ‘b’ aux modes vus dans le tableau. On
aura donc : "rb", "wb", "ab", "rb+", "ab+".
3. Type File*
• La fonction fopen renvoie un pointeur sur le type FILE.
• Tout fichier du disque dur sera associé, une fois ouvert, à une variable de type FILE*, qui doit
être préalablement définie par :
FILE* f
• La variable f est un pointeur sur un objet de type FILE. Elle contient l’adresse en mémoire du
début du fichier.
• Le type FILE est un modèle de structure défini dans stdio.h et on l'appelle le « pointeur de
fichier ».
Exemple :
Exemple :
• Cette fonction est utilisable pour les fichiers en mode texte ou binaire.
b. Avec EOF
• On peut également utiliser la constante symbolique EOF définie dans stdio.h. EOF nous permet
de tester le caractère de fin de fichier. Si le caractère lu est EOF, alors ça correspond à la fin du
fichier.
• Attention : ceci est valide pour les fichiers en mode texte uniquement.
Exemple :
Les principales fonctions disponibles pour l’écriture dans un fichier sont les suivantes :
1. La fonction fputc
Cette fonction écrit un caractère à la fois dans le fichier. Son prototype est :
int main {
if (fichier != NULL)
fclose(fichier);
return 0;
2. La fonction fputs
Cette fonction est très similaire à fputc, à la différence près qu'elle écrit tout une chaîne, ce qui est
en général plus pratique que d'écrire caractère par caractère. Cela dit, fputc reste utile lorsque vous
devez écrire caractère par caractère, ce qui arrive fréquemment.
• chaine: la chaîne à écrire. Notez que le type ici est const char* puisque la chaine ne sera
pas modifiée par la fonction.
• pointeurSurFichier: il s'agit du pointeur sur le fichier ouvert.
La fonction renvoie une valeur non negative en cas de succès, et EOF s'il y a eu une erreur.
Exemple :
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
if (fichier != NULL)
{
fputs("Salut tout le monde \n", fichier);
fclose(fichier);
}
return 0;
}
3. La fonction fprintf
La fonction fprintf peut être utilisée pour écrire dans un fichier. Elle s'utilise de la même manière que
printf, excepté le fait que vous devez indiquer un pointeur de FILE en premier paramètre. Fournit
le nombre de caractères effectivement écrits ou une valeur négative en cas d’erreur.
Exemple :
return 0;
}
1. La fonction fgetc
Lit un caractère à partir du fichier et retourne ce caractère en cas de succès, sinon renvoie EOF.
fgetc avance le curseur d'un caractère à chaque fois qu’on en lit un. Si vous appelez fgetc une
seconde fois, la fonction lira donc le second caractère, puis le troisième et ainsi de suite. Vous pouvez
donc faire une boucle pour lire les caractères un par un dans le fichier.
Exercice:
Ce programme lit tous les caractères d'un fichier un à un et les écrit à chaque fois à l'écran. La boucle
s'arrête quand fgetc renvoie EOF (qui signifie « End Of File », c'est-à-dire « fin du fichier »).
if (fichier != NULL)
{
caractereActuel = fgetc(fichier); // On lit le premier
caractère
// Boucle de lecture des caractères un à un
while (caractereActuel != EOF)
//On continue tant que fgetc n'a pas atteint la fin du
//fichier
{
}
fclose(fichier);
}
return 0;
}
2. La fonction fgets
La fonction lit au maximum une ligne (elle s'arrête au premier \n qu'elle rencontre).
Exemple :
On lit une ligne dans un fichier et on affiche cette ligne à l’écran. Pour cela, on crée une chaîne
suffisamment grande pour stocker le contenu de la ligne qu'on va lire.
Exercice
Ecrire un code source qui lit et affiche tout le contenu d’un fichier, ligne par ligne.
Le fichier
Output du programme
3. La fonction fscanf
Le prototype de la fonction fscanf est le suivant :
• F : est un pointeur du type FILE* qui est relié au nom du fichier à lire.
• <expr1>,..., <exprN> représentent les adresses des variables qui vont recevoir les valeurs lues
dans le fichier.
• <Format1>,..., <FormatN> représentent les spécificateurs de format pour la lecture des
différentes données.
• Lit les données à partir du fichier F et les stocke aux adresses indiquées.
• Retourne le nombre de données lues avec succès ou la valeur EOF si une erreur s’est produite ou
si la fin de fichier a été rencontrée avant qu’une seule valeur ait pu être lue.
Exemple
Le résultat d’exécution
size_t fwrite(const void *source, size_t taille, size_t nombre, FILE *f)
• Ecrit tout un bloc de données en un seul appel et retourne le nombre d’éléments effectivement
écrits
• source : est un pointeur vers la région de la mémoire contenant les informations à écrire dans
le fichier. Ce pointeur est de type void*, c’est-à-dire qu’il peut pointer vers n’importe quoi
• taille : spécifie la taille (en nombre d’octets) des éléments à écrire
• nombre: le nombre des éléments à écrire
• Pour savoir si la fonction est exécutée sans erreur, on peut faire le test :
o if ((fwrite(source, taille, nombre)) != nombre)
printf("Erreur d’écriture sur disque") ;
• Exemples :
o Si on veut sauvegarder un tableau de 100 valeurs numériques de type int,
taille = 4 : taille d’un entier en mémoire
• On peut utiliser l’opérateur sizeof pour connaître la taille du type à
écrire : sizeof(int)
nombre = 100
o Pour écrire une seule variable x de type double dans un fichier
double x ; fwrite(&x, sizeof(x), 1, fichier);
o Pour écrire un tableau data[] de 50 entiers, deux formes sont possibles :
fwrite(data, sizeof(int), 50, fichier);
fwrite(data, sizeof(data), 1, fichier);
Exercice: Ecrire un programme qui permet d’écrire un tableau et une chaine de caractères dans un
fichier binaire.
• destination : est un pointeur vers la région de la mémoire qui recevra les informations lues
à partir du fichier.
• taille: spécifie la taille (en nombre d’octets) des éléments à lire
• nombre : le nombre d’éléments à lire (comme pour la fonction fwrite)
• fichier : est un pointeur vers le fichier
Exercice :
Ecrire un programme qui permet de copier le contenu d’un tableau tab1 dans un fichier. Après le
programme doit copier le contenu du fichier dans un autre tableau tab2.
Résumé
1. Accès séquentiel
Consiste à traiter les informations "séquentiellement", c'est-à-dire dans l'ordre où elles apparaissent
dans le fichier. On parle d’un pointeur (sorte de curseur virtuel) qui avance à chaque fois qu’on lit ou
on écrit des octets du fichier. Par exemple, avec chaque appel à la fonction fgetc, le pointeur de
fichier avance d’une position vers la fin du fichier. On a le même comportement aussi pour l’écriture
avec fprintf.
2. Accès direct
L’accès direct consiste à se placer immédiatement sur l'information souhaitée, sans avoir à parcourir
celles qui la précèdent. Par exemple, cet accès nous permet de lire des octets au milieu du fichier
directement. Pour pouvoir faire cet accès aléatoire, on dispose de trois fonctions :
• fseek(fichier, 2, SEEK_SET);
Placer le curseur deux caractères après le début:
• fseek(fichier, -4, SEEK_CUR);
Placer le curseur quatre caractères avant la position courante. Remarquez que
deplacement est négatif car on se déplace en arrière.
• fseek(fichier, 0, SEEK_END);
Placer le curseur à la fin du fichier
Remarque :
Si vous écrivez dans le fichier après avoir fait un fseek qui mène à la fin du fichier, cela ajoutera vos
informations à la suite dans le fichier (le fichier sera complété).
En revanche, si vous placez le curseur au début et que vous écrivez, cela écrasera le texte qui se
trouvait là.
Exemple: Le programme suivant se place au 7ème caractère du fichier texte et écrit la chaine « C
Programming Language ». Ce qui fait que la ligne écrite initialement est mise à jour.