É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
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)
}
Publicité
/****************************************************************/ // 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); 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) ;
Publicité
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 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) {
Publicité
int val ; char ch[100]; while(1) {
printf("saisir un étudiant: ce, nom, date naissance, moyenne \n"); 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