Chap6 Alg PRG 2
Chap6 Alg PRG 2
Chap6 Alg PRG 2
Semestre 3
Algorithme et programmation 2
A. U : 2017-2018
Algorithmique et programmation 2
Pr. G. Mangoub
Pour des raisons d'efficacité, les accès à un fichier se font par l'intermédiaire d'une
mémoire-tampon (buffer), ce qui permet de réduire le nombre d'accès aux
périphériques(disque...).
Cette fonction, de type FILE* ouvre un fichier et lui associe un flot de données. Sa
syntaxe est :
fopen("nom-de-fichier","mode")
La valeur retournée par fopen est un flot de données. Si l'exécution de cette
fonction ne se déroule pas normalement, la valeur retournée est le pointeur NULL. Il
est donc recommandé de toujours tester si la valeur renvoyée par la
fonction fopen est égale à NULL afin de détecter les erreurs (lecture d'un fichier
inexistant...).
Le premier argument de fopen est le nom du fichier concerné, fourni sous forme
d'une chaîne de caractères. On préférera définir le nom du fichier par une constante
symbolique au moyen de la directive #define plutôt que d'expliciter le nom de
fichier dans le corps du programme.
Le second argument, mode, est une chaîne de caractères qui spécifie le mode d'accès
2
Algorithmique et programmation 2
Pr. G. Mangoub
les fichiers textes, pour lesquels les caractères de contrôle (retour à la ligne
...) seront interprétés en tant que tels lors de la lecture et de l'écriture ;
les fichiers binaires, pour lesquels les caractères de contrôle se sont pas
interprétés.
Trois flots standard peuvent être utilisés en C sans qu'il soit nécessaire de les
ouvrir ou de les fermer :
3
Algorithmique et programmation 2
Pr. G. Mangoub
Elle permet de fermer le flot qui a été associé à un fichier par la fonction fopen. Sa
syntaxe est :
fclose(flot)
où flot est le flot de type FILE* retourné par la fonction fopen correspondant.
La fonction fclose retourne un entier qui vaut zéro si l'opération s'est déroulée
normalement (et une valeur non nulle en cas d'erreur).
La fonction fscanf, analogue à scanf, permet de lire des données dans un fichier.
Sa syntaxe est semblable à celle de scanf :
fscanf(flot,"chaîne de contrôle",argument-1,...,argument-n)
où flot est le flot de données retourné par fopen. Les spécifications de format sont
ici les mêmes que celles de la fonction scanf.
EXERCICE1
On écrit un programme qui crée un fichier, il le rempli puis il lit les données à partir de ce
fichier et il les affiches à l’écran : Il s’agit des noms d’un certain nombre de personnes.
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *p_fichier ; // pointeur sur fichier
char nom_fichier[20], nom_personne[20];
int i, nbr_enregistrements;
//création et remplissage du fichier
4
Algorithmique et programmation 2
Pr. G. Mangoub
system("PAUSE");
printf("FIN");
}
5
Algorithmique et programmation 2
Pr. G. Mangoub
Il existe également deux versions optimisées des fonctions fgetc et fputc qui sont
implémentées par des macros. Il s'agit respectivement de getc et putc. Leur syntaxe
est similaire à celle de fgetc et fputc :
int getc(FILE* flot);
int putc(int caractere, FILE *flot)
int main(void)
{
FILE *f_in, *f_out;
int c;
int main(void)
6
Algorithmique et programmation 2
Pr. G. Mangoub
{
FILE *f_in;
int c;
Elles sont notamment utiles pour manipuler des données de grande taille ou ayant
un type composé. Leurs prototypes sont :
size_t fread(void *pointeur, size_t taille, size_t nombre, FILE *flot);
size_t fwrite(void *pointeur, size_t taille, size_t nombre, FILE *flot);
où pointeur est l'adresse du début des données à transférer, taille la taille des
objets à transférer, nombre leur nombre. Rappelons que le type size_t, défini
dans stddef.h, correspond au type du résultat de l'évaluation de sizeof. Il s'agit du
plus grand type entier non signé.
La fonction fread lit les données sur le flot flot et la fonction fwrite les écrit. Elles
retournent toutes deux le nombre de données transférées.
#define NB 50
#define F_SORTIE "sortie"
int main(void)
7
Algorithmique et programmation 2
Pr. G. Mangoub
{
FILE *f_in, *f_out;
int *tab1, *tab2;
int i;
8
Algorithmique et programmation 2
Pr. G. Mangoub
La fonction
int rewind(FILE *flot);
permet de se positionner au début du fichier. Elle est équivalente à
fseek(flot, 0, SEEK_SET);
La fonction
long ftell(FILE *flot);
retourne la position courante dans le fichier (en nombre d'octets depuis l'origine).
Par exemple
#include <stdio.h>
#include <stdlib.h>
#define NB 50
#define F_SORTIE "sortie"
int main(void)
{
FILE *f_in, *f_out;
int *tab;
int i;
9
Algorithmique et programmation 2
Pr. G. Mangoub
10
Algorithmique et programmation 1
G. Mangoub
11