si ton fichier tient en mémoire, tu peux le charger en entier et l'analyser d'un bloc.
pour lire des données, tu peux utiliser sscanf() & co. je n'en suis pas vraiment partisan et ça rame assez, donc le mieux est de se faire ses petites fonctions.
il te faut plusieurs choses :
* un moyen d'identifier une ligne (savoir où elle commence, où elle finit)
* dans cette ligne, identifier les caractères délimiteurs (seulement ':' dans ton cas)
* une fonction pour relire un entier, une autre pour relire une chaîne de caractères.
donc :
- tu lis le fichier : fopen(), fread(), etc dans un char* buffer.
- on définit deux indexs dans le buffer : int idx1 - début de la ligne. int idx2 - fin de la ligne.
- idx1 = 0;
- char* line = strstr(buffer, "\r\n" ) -> renvoie la position du retour à la ligne. idx2 = line - buffer donne la position de la fin de la ligne dans buffer. (la longueur de la ligne est donc idx2 - idx1.)
- il faut maintenant parser la ligne. format : un nombre, un ':', une station. puis peut se trouver une suite de ':' + station.
- on utilise un nouvel index, int curIdx = idx1 qui va servir à se repérer dans la ligne.
- pour chopper l'entier, on lit la chaine tant qu'il y a des chiffres, on update curIdx.
int parseNumber(char* buffer, int* curIdx)
{
int n = 0;
// tant qu'il y a des chiffres ...
while (*buffer >= '0' && *buffer <= '9'
{
n = n*10;
n += *buffer - '0';
*curIdx++;
*buffer++;
}
return n;
}
on l'appelle avec parseNumber(&buffer[idx1], &curIdx). (on lui passe le début de la ligne, on update l'index).
- curIdx pointe maintenant sur ':'. ça peut servir de test de format de ton fichier :
if (buffer[curIdx] != ':' maFonctionDerreur('format invalide ...';
on incrémente curIdx pour passer le ':'.
curIdx++;
- maintenant, on parse le premier nom de station :
int parseString(char* buffer, int* curIdx, char* dest)
{
int len = 0;
// tant qu'on a un caractère différent de ':', on le range dans le tableau
while (*buffer != ':'
{
dest[len] = *buffer;
*curIdx++;
*buffer++;
len++;
}
// zéro terminateur
dest[len] = 0;
return len;
}
il ne te suffit de l'appeler avec
MaillonSt curLine;
parseString(&buffer[curIdx], &curIdx, &curLine->NomDeLaStation[0]);
- maintenant, c'est simple : tu as obligatoirement (si ton fichier est bien formé) un ':' et un nom.
while (buffer[curIdx] == ':'
{
curIdx++;
parseString(... comme au-dessus).
}
- dès que buffer[curIdx] est différent de ':', c'est la fin de la ligne. on a l'index de fin de ligne : idx2. une nouvelle ligne (sous windows tout du moins) c'est deux caractères, \r\n, il suffit de rajouter 2 à idx2 pour avoir la nouvelle ligne :
curidx1 = curidx2 + 2;
on cherche alors la fin de la ligne :
curidx2 = strstr(&buffer[curidx1], strstr) - buffer;
et hop.
//
il manque certains trucs, comme la vérification que parseString() ne parse pas une string de + de 30 caractères, etc. les procédures parseX peuvent être améliorés, (ne garder qu'un index, etc.)