les
fichiers en langage C
Exercice
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)
Prénom
(chaîne de caractères)
Le nombre
d'enregistrements à créer est à entrer au clavier par l'utilisateur.
Solution :
#include <stdlib.h>
main()
{
/*
Déclarations : */
/*
Nom du fichier et pointeur de référence */
char
NOM_FICH[] = "A:\\INFORM.TXT";
FILE
*FICHIER;
/* Autres variables */
char
NOM[30], PRENOM[30];
int
MATRICULE;
int
I,N_ENR;
/*
Ouverture du nouveau fichier en écriture */
FICHIER = fopen(NOM_FICH, "w");
if
(!FICHIER)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOM_FICH);
exit(-1);
}
/* Saisie des données et création du fichier */
printf("*** Création du fichier %s ***\n", NOM_FICH);
printf("Nombre d'enregistrements à créer : ");
scanf("%d",&N_ENR);
for (I=1; I<=N_ENR; I++)
{
printf("Enregistrement
No: %d \n", I);
printf("Numéro de matricule : ");
scanf("%d",&MATRICULE);
printf("Nom
: ");
scanf("%s",NOM);
printf("Prénom : ");
scanf("%s",PRENOM);
fprintf(FICHIER, "%d\n%s\n%s\n", MATRICULE, NOM, PRENOM);
}
/*
Fermeture du fichier */
fclose(FICHIER);
/*
Ouverture du fichier en lecture */
FICHIER = fopen(NOM_FICH, "r");
if
(!FICHIER)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOM_FICH);
exit(-1);
}
/* Affichage du fichier */
printf("*** Contenu du fichier %s ***\n", NOM_FICH);
while
(!feof(FICHIER))
{
fscanf(FICHIER, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
printf("Matricule : %d\t", MATRICULE);
printf("Nom et prénom : %s %s\n", NOM, PRENOM);
}
/*
Fermeture du fichier */
fclose(FICHIER);
return 0;
}
Exercice
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.
Solution :
#include <stdio.h>
#include <stdlib.h>
main()
{
/*
Déclarations : */
/*
Noms des fichiers et pointeurs de référence */
char
ANCIEN[] = "A:\\INFORM.TXT";
char
NOUVEAU[] = "A:\\INFBIS.TXT";
FILE
*INFILE, *OUTFILE;
/* Autres variables */
char
NOM[30], PRENOM[30];
int
MATRICULE;
/* Ouverture
de l'ancien fichier en lecture */
INFILE =
fopen(ANCIEN, "r");
if (!INFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", ANCIEN);
exit(-1);
}
/*
Ouverture du nouveau fichier en écriture */
OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOUVEAU);
exit(-1);
}
/*
Copie de tous les enregistrements */
while
(!feof(INFILE))
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE, NOM, PRENOM);
}
/* Fermeture des fichiers */
fclose(OUTFILE);
fclose(INFILE);
return 0;
}
Exercice
3 :
Ajouter un
nouvel enregistrement (entré au clavier) à la fin de INFORM.TXT et sauver le
nouveau fichier sous le nom INFBIS.TXT.
Solution :
#include <stdio.h>
#include <stdlib.h>
main()
{
/*
Déclarations : */
/*
Noms des fichiers et pointeurs de référence */
char
ANCIEN[] = "A:\\INFORM.TXT";
char
NOUVEAU[] = "A:\\INFBIS.TXT";
FILE
*INFILE, *OUTFILE;
/*
Autres variables */
char
NOM[30], PRENOM[30];
int
MATRICULE;
char
NOM_NOUV[30], PRE_NOUV[30];
int
MATRI_NOUV;
/*
Ouverture de l'ancien fichier en lecture */
INFILE =
fopen(ANCIEN, "r");
if (!INFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", ANCIEN);
exit(-1);
}
/*
Ouverture du nouveau fichier en écriture */
OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOUVEAU);
exit(-1);
}
/*
Saisie de l'enregistrement à ajouter */
printf("Enregistrement à ajouter : \n");
printf("Numéro de matricule : ");
scanf("%d",&MATRI_NOUV);
printf("Nom
: ");
scanf("%s",NOM_NOUV);
printf("Prénom : ");
scanf("%s",PRE_NOUV);
/*
Copie des enregistrements de l'ancien fichier */
while
(!feof(INFILE))
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE, NOM, PRENOM);
}
/*
Ecriture du nouvel enregistrement à la fin du fichier */
fprintf(OUTFILE,"%d\n%s\n%s\n",MATRI_NOUV,NOM_NOUV,PRE_NOUV);
/*
Fermeture des fichiers */
fclose(OUTFILE);
fclose(INFILE);
return 0;
}
Exercice
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.
Solution :
#include <stdio.h>
#include <stdlib.h>
#include
<string.h>
main()
{
/*
Déclarations : */
/*
Noms des fichiers et pointeurs de référence */
char
ANCIEN[] = "A:\\INFORM.TXT";
char
NOUVEAU[] = "A:\\INFBIS.TXT";
FILE
*INFILE, *OUTFILE;
/*
Autres variables */
char
NOM[30], PRENOM[30];
int
MATRICULE;
char
NOM_NOUV[30], PRE_NOUV[30];
int
MATRI_NOUV;
int
TROUVE;
/*
Ouverture de l'ancien fichier en lecture */
INFILE =
fopen(ANCIEN, "r");
if (!INFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", ANCIEN);
exit(-1);
}
/*
Ouverture du nouveau fichier en écriture */
OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOUVEAU);
exit(-1);
}
/*
Saisie de l'enregistrement à insérer */
printf("Enregistrement à ajouter : \n");
printf("Numéro de matricule : ");
scanf("%d",&MATRI_NOUV);
printf("Nom
: ");
scanf("%s",NOM_NOUV);
printf("Prénom
: ");
scanf("%s",PRE_NOUV);
/*
Copie des enregistrements dont le nom */
/*
précéde lexicogr. celui à insérer. */
TROUVE = 0;
while
(!feof(INFILE) && !TROUVE)
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
if (strcmp(NOM, NOM_NOUV) > 0)
TROUVE = 1;
else
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE,NOM,PRENOM);
}
/*
Ecriture du nouvel enregistrement, */
fprintf(OUTFILE,"%d\n%s\n%s\n",MATRI_NOUV,NOM_NOUV,PRE_NOUV);
/* et
du dernier enregistrement lu. */
if (TROUVE)
fprintf(OUTFILE,
"%d\n%s\n%s\n", MATRICULE, NOM, PRENOM);
/* Copie du reste des enregistrements */
while
(!feof(INFILE))
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE, NOM, PRENOM);
}
/*
Fermeture des fichiers */
fclose(OUTFILE);
fclose(INFILE);
return 0;
}
Exercice
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"
(utiliser strcmp)
c) dont le nom est un palindrome.
Définir une fonction d'aide PALI qui fournit le résultat 1 si la chaîne
transmise comme paramètre est un palindrome, sinon la valeur zéro.
Sauver le
nouveau fichier à chaque fois sous le nom INFBIS.TXT.
Solution :
a) Supprimer les enregistrements, dont
le numéro de matricule se termine par 8
#include <stdio.h>
#include <stdlib.h>
main()
{
/*
Déclarations : */
/*
Noms des fichiers et pointeurs de référence */
char
ANCIEN[] = "A:\\INFORM.TXT";
char
NOUVEAU[] = "A:\\INFBIS.TXT";
FILE
*INFILE, *OUTFILE;
/*
Autres variables */
char
NOM[30], PRENOM[30];
int
MATRICULE;
/*
Ouverture de l'ancien fichier en lecture */
INFILE =
fopen(ANCIEN, "r");
if (!INFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", ANCIEN);
exit(-1);
}
/*
Ouverture du nouveau fichier en écriture */
OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
{
printf("\aERREUR:
Impossible d'ouvrir "
"le fichier: %s.\n", NOUVEAU);
exit(-1);
}
/*
Copie de tous les enregistrements à l'exception */
/* de
ceux dont le numéro de matricule se termine */
/*
par 8. */
while
(!feof(INFILE))
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
if (MATRICULE%10 != 8)
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE,NOM,PRENOM);
}
/*
Fermeture des fichiers */
fclose(OUTFILE);
fclose(INFILE);
return 0;
}
b) Supprimer les enregistrements, dont
le prénom est "Paul" (utiliser strcmp)
#include <stdio.h>
#include <stdlib.h>
#include
<string.h>
main()
{
/*
Déclarations */
. . .
/*
Ouverture de l'ancien fichier en lecture */
. . .
/*
Ouverture du nouveau fichier en écriture */
. . .
/*
Copie de tous les enregistrements à l'exception */
/* de
ceux dont le prénom est 'Paul'. */
while (!feof(INFILE))
{
fscanf (INFILE,
"%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
if
(strcmp(PRENOM,"Paul") != 0)
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE,NOM,PRENOM);
}
/* Fermeture des fichiers */
. . .
}
c) Supprimer les enregistrements, dont
le nom est un palindrome. Définir une fonction d'aide PALI qui fournit le
résultat 1 si la chaîne transmise comme paramètre est un palindrome, sinon la
valeur zéro.
#include <stdio.h>
#include <stdlib.h>
main()
{
/* Prototype
de la fonction PALI */
int
PALI(char *CH);
/* Déclarations */
. . .
/*
Ouverture de l'ancien fichier en lecture */
. . .
/*
Ouverture du nouveau fichier en écriture */
. . .
/*
Copie de tous les enregistrements à l'exception */
/* des palindromes. */
while
(!feof(INFILE))
{
fscanf (INFILE, "%d\n%s\n%s\n", &MATRICULE, NOM, PRENOM);
if (!PALI(NOM))
fprintf(OUTFILE, "%d\n%s\n%s\n", MATRICULE,NOM,PRENOM);
}
/* Fermeture des fichiers */
. . .
}
int
PALI(char *CH)
{
/* Variable locale */
char *CH2;
/* Placer CH2 à la fin de la chaîne */
for (CH2=CH; *CH2; CH2++)
;
CH2--;
/* Contrôler si la chaîne désignée par CH est
un palindrome */
for (; CH<CH2; CH++,CH2--)
if (*CH != *CH2) return
0;
return 1;
}