École Supérieure de Technologie
et d’Informatique
A.U. 2011/2012
Cours atelier de programmation avancée
Suite du chapitre les fichiers
Les fichiers textes (5 pages)
1ère année LA ARS
Dans le chapitre les fichiers binaires, nous avons rempli et affiché un fichier binaire
d’étudiants (en utilisant fread, fwrite, etc). Dans ce qui suit, nous allons remplir et afficher un
fichier texte d’étudiants (en utilisant fprintf, fscanf, fputs, fgets).
#include<stdio.h>
#include<stdlib.h>
struct date
{
int jour;
int mois;
int annee;
};
typedef struct date DATE;
struct etudiant
{
int ce;
char nom[20];
DATE date_naiss ;
float moy;
};
typedef struct etudiant ETUDIANT;
/*/
void ouverture (FILE **fp)
{
char nf[20];
printf("saisir nom fichier");
gets(nf);
*fp=fopen(nf,"wt+");
}
/*/
int saisir_etudiant (ETUDIANT *etd)
{
//condition d'arrêt : ce =-1
printf("\n saisir ce, nom, date de naissance et moyenne \n");
scanf("%i", &etd->ce);
if(etd->ce==-1) return 0;
scanf("%s%d%d%d%f", etd->nom,&etd->date_naiss.jour,&etd->date_naiss.mois,
&etd->date_naiss.annee, &etd->moy);
return 1;
}
Mme Wiem Yaiche Elleuch les fichiers textes
Publicité
Page 1
void remplir_fichier(FILE *fp)
{
ETUDIANT etd;
while ( saisir_etudiant(&etd))
fprintf(fp,"%5d %20s %2d %2d %4d %5.2f \n", etd.ce, etd.nom, etd.date_naiss.jour,
etd.date_naiss.mois, etd.date_naiss.annee, etd.moy);
// attention aux espaces dans fprintf (au niveau du deuxième paramètre)
}
/**/
// 2ème version de remplissage
void remplir_fichier(FILE *fp)
{
ETUDIANT etd;
while (1)
{
printf("\n saisir ce, nom, date de naissance et moyenne \n");
scanf("%d", &etd.ce);
if(etd.ce==-1) break;
scanf("%s%d%d%d%f", etd.nom,&etd.date_naiss.jour,&etd.date_naiss.mois,
&etd.date_naiss.annee, &etd.moy);
fprintf(fp,"%5d %20s %2d %2d %4d %5.2f \n", etd.ce, etd.nom, etd.date_naiss.jour,
etd.date_naiss.mois, etd.date_naiss.annee, etd.moy);
}
}
/*/
void affichage_fichier(FILE *fp)
{
ETUDIANT etd;
while(1)
{
fscanf (fp,"%d%s%d%d%d%f ", &etd.ce, etd.nom, &etd.date_naiss.jour,
&etd.date_naiss.mois, &etd.date_naiss.annee, &etd.moy);
printf("\n le ce est: %5d, le nom est %20s, la date de naissance est %2d / %2d/ %4d,
et la moyenne est %5.2f \n", etd.ce, etd.nom, etd.date_naiss.jour, etd.date_naiss.mois,
etd.date_naiss.annee, etd.moy);
if(feof(fp)) break;
}
}
/*/
void main()
{
FILE *fp;
int n=0,i=0;
ouverture (&fp);
remplir_fichier(fp);
rewind(fp);
Publicité
affichage_fichier(fp);
fclose(fp);
}
//
Mme Wiem Yaiche Elleuch les fichiers textes
Page 2
La fonction fputs
puts transmet une chaîne à la sortie standard stdout.
fputs écrit une chaîne dans le fichier (le caractère de fin de chaîne n’est pas transmis)
fputs n’envoie aucun caractère de fin de ligne
fputs(s,fp) ;
fputs a deux arguments :
s : adresse d’une chaîne de caractères.
fp : descripteur du fichier
Cette fonction retourne une valeur non négative quand le déroulement a été correct, EOF en
cas d’erreur.
Rq :
for(i=0 ;i<3 ;i++) fputs(“bonjour”, fp);
Le contenu du fichier obtenu se présentera ainsi:
bonjourbonjourbonjour
fputs(s,fp) ; fprintf(fp, « %s »,s) ;
for(i=0 ;i<3 ;i++)
fprintf(fp, « %s\n»,s) ;
Le contenu du fichier obtenu se présentera ainsi:
bonjour
bonjour
bonjour
//
La fonction fgets
gets permet de lire des chaînes sur l’unité standard d’entrée stdin.
fgets permet de lire des chaînes de caractères à partir d’un fichier.
fgets(s,n,fp);
fgets possède 3 arguments :
Adresse à laquelle seront rangées les valeurs lues.
n-1 : nombre maximal de caractères à lire. n désigne le nombre maximal de caractères
qui seront introduits en mémoire, compte tenu du zéro de fin de chaine.
Descripteur du fichier.
Cette fonction retourne l’adresse de la chaîne lue quand l’opération s’est bien déroulée, le
pointeur NULL en cas d’erreur.
Remarques :
Lors de la rencontre d’un caractère de fin de ligne au cours de la lecture des n-1
caractères, ce caractère \n est alors recopié en mémoire, contrairement à ce qui se
produit avec gets.
En cas de rencontre d’une fin de fichier : si aucun caractère n’a encore été lu, il s’agira
d’une erreur. Si au moins un caractère a été lu, la lecture sera considérée comme
normale. Cela revient à dire qu’une fin de fichier peut servir de délimiteur d’une
Publicité
chaîne à condition qu’il ne s’agisse pas d’une chaîne vide.
Dans le cas d’une lecture sans erreurs, un zéro de fin de chaine \0 est introduit à la
suite des caractères lus. Le nombre de caractères introduits en mémoire est au plus
égal à n.
Mme Wiem Yaiche Elleuch les fichiers textes
Page 3
En cas d’erreur, le contenu de l’emplacement d’adresse s est indéterminé. En pratique,
on y trouve tout ou partie des caractères lus avant l’erreur
fwrite(ch, strlen(ch),1, fp) ; fputs(ch,fp) ; fprintf(fp, “%s”, ch);
puts (ch) ; printf(« %s\n »,ch) ;
Exemple :
Exercice d’application :
Ecrire un programme qui remplit un fichier texte par des étudiants : carte d’étudiant, nom,
date de naissance et moyenne, ensuite affiche le contenu du fichier.
#include<stdio.h>
#include<stdlib.h>
struct date
{
int jour;
int mois;
int annee;
};
typedef struct date DATE;
struct etudiant
{
int ce;
char nom[20];
DATE date_naiss ;
float moy;
};
typedef struct etudiant ETUDIANT;
/*/
void ouverture (FILE **fp)
{
char nf[20];
printf("saisir nom fichier");
gets(nf);
*fp=fopen(nf,"wt+");
}
/*/
void remplir(FILE *fp)
{
int val ;
char ch[100];
while(1)
{
printf("saisir un étudiant: ce, nom, date naissance, moyenne \n");
Publicité
gets(ch);
if(*ch=='0') break; // condition arrêt: l'utilisateur saisit 0
val=fputs(ch,fp);
/ test pour détecter s'il ya une erreur /
if (val == EOF) printf("erreur d'écriture");
fputs("\n",fp);
}
}
Mme Wiem Yaiche Elleuch les fichiers textes
Page 4
void afficher(FILE *fp)
{
char ch[100];
rewind(fp);
while (fgets(ch,100,fp))
puts(ch) ; // affichage du contenu de la chaine ch tel qu'il est
}
/**/
//2ème version
void afficher(FILE *fp)
{
char ch[100];
ETUDIANT etd ;
rewind(fp);
while (fgets(ch,100,fp))
{
sscanf(ch,"%d%s%d%d%d%f", &etd.ce, etd.nom, &etd.date_naiss.jour,
&etd.date_naiss.jour, &etd.date_naiss.jour, &etd.moy );
printf("ce:%d nom:%s jour:%d mois:%d annee:%d moy:%5.2f\n", etd.ce,
etd.nom, etd.date_naiss.jour, etd.date_naiss.jour, etd.date_naiss.jour, etd.moy);
}
}
/*/
void main()
{
FILE *fp;
int n=0,i=0;
ouverture (&fp);
remplir(fp);
rewind(fp);
afficher(fp);
fclose(fp);
}
Mme Wiem Yaiche Elleuch les fichiers textes
Page 5