V. Traitement d'un fichier de type CSV▲
Un fichier CSV (Comma-separated values), est un fichier représentant des données tabulaires. Chaque valeur est délimitée par une virgule ou point-virgule (suivant la localisation ou le programme qui génère le fichier). Si vous ne connaissez pas ou pas trop ce type de fichier, vous pouvez en savoir plus en suivant ce lien. Ici nous allons voir la forme la plus simple de ce type mais il en existe plusieurs formes, voici notre exemple :
Robert;Dupont;12 rue du verger;Strasbourg;67000
Le code étant assez simple à mettre en oeuvre, nous n'allons pas passer par une étude algorithmique mais nous allons nous plonger directement dans le vif du sujet !
V-1. Fonction : get_contact▲
Dans notre exemple, cette fonction ne lit que la première ligne du fichier passé en argument mais avec quelques modifications, il est tout à fait possible de lui faire rechercher un contact précis !
La fonction retourne une structure dans le même genre que celle que nous avons utilisée dans le Chapitre III :
typedef
struct
{
char
*
nom;
char
*
prenom;
char
*
adresse;
char
*
ville;
int
code;
}
contact_infos;
Les constantes utilisées dans l'instruction switch sont définies ainsi :
typedef
enum
{
NOM, /* commence a l'index O par defaut */
PRENOM,
ADRESSE,
VILLE,
CODE,
NB_TYPE
}
infos_type;
Voyons le déroulement de la fonction :
On commence comme d'habitude par ouvrir notre fichier (1), ici celui dont le nom a été passé en argument.
On lit la première ligne du fichier (2), si la ligne a été lue avec succès, on alloue un espace pour notre
structure (3). Après le test d'allocation, nous utilisons la fonction strtok
pour extraire les informations (4), parlons-en un peu de cette fonction...
strtok permet d'extraire des mots d'une chaîne (éléments lexicaux) en lui fournissant une suite de délimiteurs.
Il faut cependant être très prudent avec cette fonction car elle modifie la chaîne passée en argument. Après chaque mot
trouvé, elle met un caractère '\0' après le délimiteur, si vous devez donc réutiliser la chaîne plus tard, il
est conseillé de travailler sur une copie de la chaîne ! Vous pouvez voir dans le code ci-dessus (5) que nous
mettons le pointeur p, qui pointe sur la chaîne, à la valeur NULL. Ceci pour la simple et bonne raison que cet argument
doit être à cette valeur (c'est pour cette raison également que nous utilisons ce pointeur car on ne peut mettre un
tableau statique à NULL) pour les appels suivants, sinon la fonction recommence au début de la chaîne.
On termine ensuite par une simple instruction switch pour récupérer les informations une à une (6),
à chaque mot (token ou élément lexical) trouvé correspond donc une information.
V-2. Code source complet▲
Robert;Dupont;12 rue du verger;Strasbourg;67000
Nom complet : Robert Dupont
Adresse : 12 rue du verger
Ville : 67000 Strasbourg