Les fichiers textes - Cours atelier de programmation avancée

Page 1 sur 5Lecteur de document UniversityLib

Les fichiers textes - Cours atelier de programmation avancée

Computer Programming · notes

Voir tous les documents en programmation

É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