Monday 10 April 2017

TP 12, Codes sources

  • Programme 1: Création
#include <stdio.h>
#include <stdlib.h>
typedef struct {int jour,mois,annee;} tDate;
typedef struct {char nom[20],prenom[20],poste[20]; tDate date; } tEmploye;
typedef struct {char poste[20]; float salaire; } tPoste;
int getFichEmploye(char *);
int main(){
    getFichEmploye("listEmploye.txt");
    return 0;
}
int getFichEmploye(char *nomFichier){
   FILE *ptFichier;
   tEmploye employe;
   int  comp,nbrEmploye;

   printf("Donner le nbr d'employes : ");
   scanf("%d",&nbrEmploye);
   ptFichier=fopen(nomFichier,"wt");
   if(!ptFichier){printf("\n La creation de fichier a echouee!");return 1;}
   for(comp=0;comp<nbrEmploye;comp++){
      printf("Entrez le nom de la personne N%d: ",comp+1);
      scanf("%s", employe.nom); // sans espaces
      fprintf(ptFichier, "%s\t", employe.nom);
      printf("Entrez le prenom de %s : ",employe.nom);
      scanf("%s", employe.prenom);
      fprintf(ptFichier, "%s\t",employe.prenom);
      printf("Donner le poste de %s %s:",employe.nom,employe.prenom);
      scanf("%s",employe.poste);
      fprintf(ptFichier, "%s\t",employe.poste);
      printf("Donner la date de recrut de %s %s (jj/mm/yyyy):",employe.nom,employe.prenom);
      scanf("%d/%d/%d",&(employe.date.jour),&(employe.date.mois),&(employe.date.annee));
      fprintf(ptFichier, "%d/%d/%d\n",employe.date.jour,employe.date.mois,employe.date.annee);
    }
    fclose(ptFichier);
    return 0;
}


  • Programme 2: Lecture
#include <stdio.h>
#include <stdlib.h>
typedef struct {int jour,mois,annee;} tDate;
typedef struct {char nom[20],prenom[20],poste[20];tDate date;} tEmploye;
int affichListEmploye(char *);
int main(){
    affichListEmploye("listEmploye.txt");
//ajouter le chemin    
    return 0;
}
int affichListEmploye(char *fichEmploye)
{
    FILE *ptFichEmploye;
    tEmploye employe={"","","",{0,0,0}};int i=1;

    ptFichEmploye = fopen(fichEmploye,"rt");
    if(!ptFichEmploye){
        printf("Impossible d'ouvrir le ficher %s, arret d'execution",fichEmploye);
        return 1;
    }
    while(!feof(ptFichEmploye)){ //on suppose le fichier non vide
        fscanf(ptFichEmploye,"%s\t",employe.nom);
        fscanf(ptFichEmploye,"%s\t",employe.prenom);
        fscanf(ptFichEmploye,"%s\t",employe.poste);
        fscanf(ptFichEmploye,"%d/%d/%d\n",&(employe.date.jour),&(employe.date.mois),&(employe.date.annee));
        printf("\nNom%3d:%s\tPrenom:%s\tPoste:%s",i++, employe.nom,employe.prenom,employe.poste);
        printf("\tdate recrut:%d/%d/%d",employe.date.jour,employe.date.mois,employe.date.annee);
    }
    fclose(ptFichEmploye);
    return 0;
}

  • Remarks/Further reading
1. Ajouter le chemin du fichier listEmploye.txt en lecture:
  • Sous linux: affichListEmploye("/votre/chemin/listEmploye.txt");
  • Sous Windows : dans le chemin, ne pas oublier de doubler les \ (corrigé suite a la remarque de IcyRaceHoeses)
2. Resolution du pb de fichier existant mais vide: On remplace les lignes 20 à 27 par:
while(1){
        fscanf(ptFichEmploye,"%s\t",employe.nom);
        if(feof(ptFichEmploye)){printf("\n fichier vide, arret d'execution"); fclose(ptFichEmploye);return 1;}
        fscanf(ptFichEmploye,"%s\t",employe.prenom);
        fscanf(ptFichEmploye,"%s\t",employe.poste);
        fscanf(ptFichEmploye,"%d/%d/%d\n",&(employe.date.jour),&(employe.date.mois), &(employe.date.annee));
        printf("\nNom%3d:%s\tPrenom:%s\tPoste:%s",i++, employe.nom,employe.prenom,employe.poste);
        printf("\tdate recrut:%d/%d/%d",employe.date.jour,employe.date.mois,employe.date.annee);
    }

3. EOF bien expliqué:
https://latedev.wordpress.com/2012/12/04/all-about-eof/
4. Gestion de repertoires en C (hors programme MI)
http://www.thegeekstuff.com/2012/06/c-directory/