Bonjour à tous,

Je ne tournerais pas autour du pot, alors voila, je dois extraire des données d'un fichier CSV et en me baladant sur le Net, je suis tombé sur un excellent tuto de Frank H. sur lequel je me suis appuyé malgré mon très faible niveau (en C).

Seulement je dois avoir un problème au niveau de l'étude algorithmique car je pense m'etre trop appuyer sur le tuto alors que les objectifs sont sensiblement différent.

(Pardon je tourne autour du pot...)

Donc mon objectif est l'extraction des données d'un fichier CSV (recensement des pays par année), dans le but de manipuler ces données par la suite.

Le programme compile mais plante à l'execution.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}
PS : Je précise que mon but est uniquement la compréhension et que je retirerais ce code si ça devait gêner Frank H.


Merci beaucoup d'avance.