1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Permet de copier une chaine de caracteres.
//Grosse utilisation dans le cas de l emploi de strtok qui modifie la chaine passee en entrée
static char * copie_chaine (const char * chaine)
{
char * copie = NULL;
if (chaine != NULL)
{
size_t taille = strlen (chaine) + 1;
copie = malloc (taille);
if (copie != NULL)
{
memcpy (copie, chaine, taille);
}
}
return copie;
}
//Permet de terminer la chaine de caracteres avec un zero de fin de chaine
//ce qui n'est pas le cas avec les chaines extraites d'un fichier qui elles terminent avec un \n
// Or les fonctions standards attendent des zeros de fin
static void term_chaine(char * chaine){
char * p = strchr(chaine, "\n");
if(p != NULL){
*p=0;
}
}
//structure definissant un pays
typedef struct
{
char * nomPays;
int annee;
int popuTotale;
int nbH;
int nbF;
char * tranchAge;// exemple : 35-36
}
infos_pays;
//tres utile pour le switch
typedef enum
{
NOM_PAYS,
ANNEE,
TRANCHAGE,
NBTOTAL,
NBH,
NBF
} infos_type;
infos_pays * get_infos_8 (const char * file)
{
infos_pays * infos = NULL;//structure de retour
FILE * fic = NULL;
char * k = NULL;
char *buff [1000];//tampon
fic = fopen (file, "r");
if (fic != NULL)
{
if ((fgets (buff, 1000, fic)) != NULL)//lit le fichier ligne par ligne
{
char * p = buff;
int i = 0;
infos = malloc (sizeof (* infos));
if (infos != NULL)
{
while ((k = strtok (p, ",")) != NULL)// tant qu'il y a des mots a extraire
{
if (i == 0)//premier retour de strtok donc pour le nom pays
p = NULL;
switch (i)
{
case NOM_PAYS:
infos->nomPays = copie_chaine (k);
break;
case ANNEE:
infos->annee = copie_chaine (k);
break;
case TRANCHAGE:
infos->tranchAge = copie_chaine (k);
break;
case NBTOTAL:
infos->popuTotale = copie_chaine (k);
break;
case NBH:
infos->nbH = copie_chaine (k);
break;
case NBF:
infos->nbF = copie_chaine (k);
break;
}
i++;//mot suivant
}
}
}
fclose (fic);
}
printf("Pays : %s -> Check !", infos->nomPays);//surement ce qui provoque l erreur d exec
return infos;
} |
Partager