Vous êtes sur la page 1sur 7

Année académique 2019-2020

Classe : L1IT/FPC
Date :29/07/2020
Enseignant : M. LOYA

TP n°3 DE LANGAGE C
Objectif :
− Manipuler les fichiers

Exercice 1
On souhaite la liste des pays africains à l’aide de fichier.
1) Ecrire un programme en C (nom du projet : GesPays ; nom du fichier principal : GesPays) qui crée un fichier texte
dont le nom (y compris le chemin) est donné. Le programme doit afficher un message en cas d’erreur de création et
un autre message en cas de succès.
Exécuter le programme. En cas de succès, aller constater la création effective du fichier dans le dossier indiqué.
Indication : A l’exécution, taper c:\<votre nom>\payssimple1 comme nom du fichier
2) Compléter le programme afin qui ouvre en écriture le fichier payssimple1 et y enregistre les noms des pays caractère
par caractère à partir d’une lecture caractère par caractère du clavier.
Exemple d’exécution :

Ouvrir le fichier payssimple1 avec Bloc-notes. Qu’observez-vous ?


3) Compléter le programme afin qui ouvre en lecture le fichier payssimple1 et affiche les pays par caractère par
caractère.
Exemple d’exécution :

Indication pour 2) et 3) : Utiliser les fonctions d’écriture/lecture caractère par caractère de stdio.h
Syntaxe Action

La fonction fputc écrit le caractère c dans le fichier f, retourne le caractère écrit ou EOF en cas d'échec. Le
fputc(c, f)
pointeur du fichier est automatiquement positionné derrière l’octet écrit.
putc(c, f) putc fait la même chose que fputc, mais putc est une macro.
Envoie le caractère c sur la sortie standard stdout. putchar est une macro. putchar (c) équivaut à putc(c,
putchar(c)
stdout).
La fonction fgetc retourne le prochain caractère présent sur f ou EOF si la fin de fichier est atteinte ou si une
fgetc(f) erreur survient. Le pointeur du fichier est automatiquement positionné derrière l’octet lu.

getc(f) getc fait la même chose que fgetc, mais getc est une macro.
La macro getchar retourne le prochain caractère présent sur l'entrée standard (stdin).
getchar()
getchar() équivaut à getc(stdin)
4) Ecrire un programme en C (nom du projet : GesPays1 ; nom du fichier principal : GesPays1) qui crée un fichier
texte dont le nom (y compris le chemin) est donné par l’utilisateur, y enregistre les noms des pays ligne par ligne,
puis affiche ensuite ligne par ligne les pays enregistrés.
Indication : A l’exécution, taper c:\<votre nom>\payssimple2 comme nom du fichier

1
Exemple d’exécution :

Comparer le fichier créé avec celui créé en 3)


Indication : Utiliser les fonctions d’écriture/Lecture ligne par ligne de stdio.h :
Syntaxe Action

fputs écrit le caractère ch dans le fichier f, retourne EOF en cas d'échec et une valeur non négative (le dernier
fputs(ch, f)
caractère écrit) dans les autres cas. Le pointeur du fichier est automatiquement positionné derrière l’octet écrit.
puts envoie les caractères de ch sur la sortie standard stdout, plus un '\n’ final. puts(ch) équivaut à fputs(ch,
puts(ch)
stdout)+fputc(‘\n’).
fgets lit des caractères depuis f, les place dans l’espace pointé par ch ; elle s’arrête lorsqu’elle a lu taille-1, ou
lorsqu’elle a rencontré le caractère de ligne ‘\n’ (dans ce cas ce caractère est copié dans la chaîne) ou le caractère
fgets(ch, taille, f)
EOF. Le caractère nul ‘\0’ est ajouté à la fin de la chaîne ch. fgets retourne ch ou NULL en cas d'échec. Le
pointeur du fichier est positionné après le dernier octet lu.
gets lit une ligne de texte (terminée par '\n') depuis l'entrée standard (stdin), l'enregistre dans ch jusqu'à atteindre
fgets(ch) un caractère de fin de ligne, ou EOF, qu'il remplace par '\0'. Il n’y a pas de vérification de débordement de ch.

5) Ecrire un programme en C (nom du projet : GesPays2 ; nom du fichier principal : GesPays2) qui crée un fichier
texte dont le nom (y compris le chemin) est donné, y enregistre les pays avec leurs capitales et superficies, puis les
affiche ensuite.
Indication : A l’exécution, taper c:\<votre nom>\payssimple3 comme nom du fichier
Utiliser les fonctions d’écriture/lecture formatées de stdio.h :
Syntaxe Action

fprintf écrit dans le fichier f la chaîne de caractère format en remplaçant éventuellement les
formateurs (%xx) contenus dans format par les valeurs des expressions var1, . . ., varn,
fprintf (f, format [,var1,...,varn])
converties en chaînes de caractères. fprintf renvoie le nombre de caractères effectivement écrits
ou EOF en cas d’erreur.
printf (format [,var1,...,varn]) printf(format[,var1,...,varn])équivaut à fprintf(stdout, format [,var1,...,varn])
fscanf lit les caractères contenus dans le fichier f, les convertit en un type correspondant au format
format et les enregistre dans les emplacements référencés par ref1,..., refn. La lecture est
fscanf (f, format, ref1,...,refn) interrompue quand les données lues ne correspondent pas au format spécifié ou quand la fin de
fichier est rencontrée. fscanf renvoie le nombre de caractères convertis et affectés ou EOF en cas
d’erreur

scanf (format, ref1,...,refn) scanf(format, ref1,...,refn) équivaut à fscanf(stdin, format, ref1,...,refn)


Exemple d’exécution :

2
6) Ecrire un programme en C (nom du projet : GesPays3 ; nom du fichier principal : GesPays3) qui crée un fichier
binaire dont le nom (y compris le chemin) est donné, y enregistre les pays avec leurs capitales et superficies (entier
long), puis les affiche ensuite.
Indication : A l’exécution, taper c:\<votre nom>\payssimple4 comme nom du fichier
Utiliser les fonctions d’écriture/lecture binaires de stdio.h :
Syntaxe Action

fwrite écrit dans le flot f nb objets ayant chacun une taille de tail octets et placés les uns à la suite
fwrite(ptr, tail, nb, f) des autres dans une zone pointée par ptr et retourne le nombre d'objets (et non le nombre d'octets)
réellement écrits ou 0 en cas d'erreur ou de fin de fichier.
fread essaie de lire dans le flot f nb objets ayant chacun une taille de tail octets et les range les
fread(ptr, tail, nb, f) uns à la suite des autres dans la zone pointée par ptr. Cette fonction retourne le nombre d'objets
réellement lus ou la valeur 0 si la fin du fichier est rencontrée ou s'il y a une erreur de lecture
Exemple d’exécution :

Ouvrir le fichier payssimple4 avec Bloc-notes. Que constatez-vous ?


7) A partir du fichier binaire des pays payssimple4, écrire un programme (nom du projet : GesPays4 ; nom du fichier
principal : GesPays4) qui crée un fichier binaire des populations contenant les numéros des pays dans payssimple4
et les populations (entier long) des pays qui sont entrées par l’utilisateur. Le programme doit afficher ensuite le
fichier créé.
Exemple d’exécution :

Indication : A l’exécution, taper c:\<votre nom>\payssimple5 comme nom du fichier

3
8) On veut écrire un programme (nom du projet : GesPays5 ; nom du fichier principal : GesPays5) qui renseigne les
champs population et densité dans le fichier des pays à partir du fichier des populations. Le programme doit afficher
le fichier des pays complété.
Exemple d’exécution :

Indication : Utiliser les fonctions de positionnement de stdio.h :


Syntaxe Action

fseek permet de se déplacer de depl(peut être<0)octets dans le flot f, en partant de orig. orig peut
être:
SEEK_SET (égal à 0) : début du fichier ;
fseek(f, depl, orig)
SEEK_CUR (égale à 1) : position courante;
SEEK_END (égal à 2) : fin du fichier.
fseek retourne 0 en cas de succès et une valeur non nulle sinon.
ftell(f) ftell retourne la position courante dans le flot f, en nombre d'octets à partir du début du fichier.
rewind positionne le pointeur du fichier en début de fichier. rewind(f) équivaut à
fscanf (f, format, ref1,...,refn)
fseek(f, 0L, SEEK_SET)
9) Ecrire un programme (nom du projet : GesPays6 ; nom du fichier principal : GesPays6) qui permet d’ajouter au
fichier des pays (payssimple4) d’autres pays.
Exemple d’exécution :

10) Écrire un programme (nom du projet : GesPays7 ; nom du fichier principal : GesPays7) qui affiche tous les pays
ayant la densité maximale. Exemple d’exécution :

11) Écrire un programme (nom du projet : GesPays8 ; nom du fichier principal : GesPays8) qui insère un nouveau pays
à une position donnée par l’utilisateur. Exemple d’exécution :

4
Indication : Utiliser un fichier d’aide :
− Ouvrir le fichier à mettre à jour en lecture
− Ouvrir le fichier d’aide en écriture
− Copier dans le fichier d’aide tous les enregistrements du fichier à mettre à jour qui précèdent le nouvel
enregistrement
− Ecrire le nouvel enregistrement dans le fichier d’aide
− Copier dans le fichier d’aide le reste des enregistrements du fichier à mettre à jour
− Fermer les deux fichiers
− Ouvrir le fichier d’aide en lecture et le fichier à mettre à jour en écriture
− Copier le fichier d’aide dans le fichier à mettre à jour
− Fermer et détruire le fichier d’aide
Les pays ont été affichés avant et après insertion.
12) Écrire un programme (nom du projet : GesPays9 ; nom du fichier principal : GesPays9) qui modifie un pays donné.
Exemple d’exécution :

13) Écrire un programme (nom du projet : GesPays10 ; nom du fichier principal : GesPays10) qui supprime tous les
pays dont la densité est inférieure à un seuil donné.
Indication :
− Recopier un fichier à un les enregistrements dans le fichier d’aide sauf ceux à supprimer.
− Ensuite, recopier le d’aide dans le fichier à modifier.
Exemple d’exécution :

5
Exercice 2 : suite exercice 1 du TPn°2
1) Déclarer dans livre.h et définir dans livre.c la fonction void sauve_livre(t_livre livre, FILE
*f) qui enregistre le livre passé en paramètre dans le fichier désigné par f (on suppose que le fichier a déjà été
ouvert en écriture). Dans le fichier créé, séparer les champs en utilisant des tabulations '\t'.
2) Déclarer dans livre.h et définir dans livre.c la fonction void charge_livre(t_livre* livre,
FILE *f) qui charge un livre dans le fichier désigné par f (on suppose que le fichier a déjà été ouvert en écriture)
, et qui passe ce livre par adresse.
3) Déclarer dans livre.h et définir dans livre.c la fonction void sauve_stock(t_livre stock[N],
int n, char* fichier) qui reçoit en paramètre un tableau représentant le stock de la librairie, et une chaîne
de caractères représentant le nom d’un fichier. La fonction doit ouvrir ce fichier en écriture, et y enregistrer les n
livres présents dans le stock. Utiliser la fonction sauve_livre.
Tester la fonction en saisissant quelques livres avec saisis_stock, puis en enregistrant avec sauve_stock
le stock obtenu, et enfin en visualisant directement dans Bloc-notes le contenu du fichier texte ainsi produit.
4) Déclarer dans livre.h et définir dans livre.c la fonction void charge_stock(t_livre stock[N],
int* n, char* fichier) qui reçoit en paramètre un tableau représentant le stock de la librairie, qui est pour
l’instant vide, et une chaîne de caractères représentant le nom d’un fichier. La fonction doit ouvrir ce fichier en
lecture, et en charger tous les livres contenus, pour les placer le tableau stock. La fonction doit utiliser
charge_livre. Le paramètre n sert à renvoyer par adresse le nombre de livres lus dans le fichier.
Tester la fonction en éditant, directement dans Bloc-notes, le fichier texte produit à l’exercice précédent, de façon à
le compléter avec quelques livres supplémentaires ; puis en chargeant ce fichier avec charge_stock et enfin en
l’affichant avec affiche_stock.
5) Ecrire un programme test

Exercice 3
On souhaite stocker sur disque dur ou disquette les opérations concernant des comptes bancaires. Chaque opération
constitue une ligne de la forme : Numéro_de_compte Date Montant Libellé
1. Ecrire un algorithme permettant de saisir un nombre indéterminé d’opérations et de les stocker dans un fichier.
On considère que l’utilisateur ne commet pas d’erreur de saisie.
2. Ecrire un algorithme permettant de relire et d’afficher les données stockées dans le fichier précédent.
3. Ecrire un algorithme permettant d’ajouter les données du fichier précédent aux données d’un fichier préexistant,
non vide, de même structure.

Exercice 4
Une entreprise souhaite enregistrer les informations (matricule, nom, prénom, grade, salaire) sur ses employés.
1.Définir la structure du fichier des employés
2.Ecrire une fonction permettant de créer et remplir le fichier des employés
3.Ecrire une fonction permettant d’afficher la liste des employés à partir de leur fichier.
4.Ecrire une fonction permettant d’afficher la liste des employés dont le salaire est compris entre 500 000 et 700 000
5.Ecrire une fonction permettant de rechercher un employé dans le fichier à partir de son matricule. Si l’employé est
trouvé, le programme doit afficher son nom, son prénom et son grade, sinon il doit afficher ce message « Ce
matricule ne figure pas dans le fichier »
6.Ecrire une fonction qui copie les salaires des employés dans un tableau T_Salaire.
7.Ecrire une fonction qui trie le tableau T_Salaire dans l’ordre décroissant.
8.Ecrire une fonction qui copie les salaires triés dans un nouveau fichier Fi_Salaires

Exercice 5
1. Créer sur disquette puis afficher à l'écran le fichier INFORM.TXT dont les informations sont structurées de la
manière suivante:
− Numéro de matricule (entier)
− Nom (chaîne de caractères)

6
− Prénom (chaîne de caractères)
Le nombre d'enregistrements à créer est à entrer au clavier par l'utilisateur.
2. Ecrire un programme qui crée sur disquette un fichier INFBIS.TXT qui est la copie exacte (enregistrement par
enregistrement) du fichier INFORM.TXT.
3. Ajouter un nouvel enregistrement (entré au clavier) à la fin de INFORM.TXT et sauver le nouveau fichier sous le
nom INFBIS.TXT.
4. Insérer un nouvel enregistrement dans INFORM.TXT en supposant que le fichier est trié relativement à la rubrique
NOM et sauver le nouveau fichier sous le nom INFBIS.TXT.
5. Supprimer dans INFORM.TXT tous les enregistrements :
a) dont le numéro de matricule se termine par 8
b) dont le prénom est "Paul"
c) dont le nom est un palindrome. Définir une fonction d'aide PALI qui fournit vrai si la chaîne
transmise comme paramètre est un palindrome, sinon faux.
Sauver le nouveau fichier à chaque fois sous le nom INFBIS.TXT.

Exercice 6
Soit un fichier d'articles de commerce caractérisés par le numéro (int), le nom (chaîne de caractères de 20 caractères
au maximum), le prix hors taxe(float) et la quantité en stock(int).
1°) Créer ce fichier et le remplir avec des données.
Indication: - Un numéro article nul indique la fin de saisie
- Appeler le fichier articles.dat
2°) Les enregistrements sont rangés de façon consécutive et numérotés de 0 à n-1, pour un fichier de taille n.
Exemple: Fichier avec 5 enregistrements (présentés verticalement ici)

Ecrire un programme qui saisit un entier n et qui lit le nième enregistrement dans le fichier pour afficher son nom. Pour
n = 4 on doit afficher Livre.
3°) Dans la question précédente, on accède directement à un article étant donné son rang dans le fichier (si toutefois
on le connaît). Or le rang n'est une caractéristique d'article comme le numéro, le prix ou le nom.
On voudrait surtout accéder à un article étant donné son numéro (ou son nom ou autre caractéristique). On accède
directement à l'article "11, Livre, 2, 22" en donnant son numéro article 11 (on dit aussi clé).
Une idée de réaliser cet accès est de créer un index. C'est un deuxième fichier qui contient pour chaque clé numéro
d'article, le rang physique de l'enregistrement dans le fichier. C'est à dire au numéro d'article 11 on fait correspondre le
rang 3. Voir figure ci-dessous.

La recherche du l'article 11 par exemple, se fait en deux étapes:


• Etape 1: On parcourt d'abord le fichier index à la recherche de l'enregistrement de clé 11 (recherche triée).
On a alors la valeur 3 de l'autre champ.
• Etape 2: On accède ensuite au fichier indexé article directement à l'enregistrement de rang 3, qui est livre ici.
a) Ecrire un programme qui crée le fichier index sur le numéro de l’article. Pour l’index, on parcourt séquentiellement
le fichier article à indexer, et on sauvegarde dans un tableau les couples <numéro article, i> i=0..n. Soit ici <12, 0>,
<5, 1>, <34, 2>, <11, 3>, <8, 4> etc. On trie ce tableau par ordre croissant de numéro article. Soit <5, 1>, <8, 4>,
<11, 3> etc. On crée ensuite le fichier index à partir de ce tableau trié
b) Ecrire un programme qui fait la recherche du nom d'un article étant donné son numéro. Le programme doit utiliser
l'index ainsi créé.
c) Faire de même avec un index sur les noms cette fois-ci. Ecrire le programme qui cherche le prix d'un article de nom
donné.