Hoy!
Un probl�me plus ou moins simple que je n'arrive pas vraiment � r�soudre.
J'ai �cris une s�rie de fonction afin de pouvoir r�cup�rer des param�tres d'une chaine format�e. Ces param�tre peuvent �tre des float, des bool, des string, etc. Les chaines sont stock�es dans un fichier et s�par�es par un saut de ligne. Je sais quel est le type de tel param�tre � telle endroit.
J'ai �cris quelques fonction pour r�cup�rer ses param�tres, que voici :
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 // J'ouvre le fichier qui contient std::stringstream URL; URL << "game/stage" << stage_number; // Stage number est int, d'où l'utilisation du stringstream std::ifstream file(URL.str().c_str()); std::string data; // Le string qui va me servir à stocker ma chaine // Je récupère la chaine d'un fichier que je parcours avec std::getline while(std::getline(file, data)) { std::string label; int pos = 0; // Le curseur qui va me permettre de parcourir ma chaine pos = data.find(":"); // On recupère le premier paramètre, séparé par un ":" label = data.substr(0, data.find(":")); // stockage du premier parametre // En réalité, je fais un switch avec le label récupéré, via un std::map, et pour chaque label, je traite la ligne différement. Je met ici les lignes où il y a un bug std::string ennemy_name; float time, x, y, angle; ennemy_name = GetParameter(pos, data); // On récupère le parametre NextParameter(pos, data); // On passe au suivant time = static_cast<float>(std::atof(GetParameter(pos, data).c_str())); // On récpère le parametre NextParameter(pos, data); // On passe au suivant, etc... x = static_cast<float>(std::atof(GetParameter(pos, data).c_str())); NextParameter(pos, data); y = static_cast<float>(std::atof(GetParameter(pos, data).c_str())); NextParameter(pos, data); angle = static_cast<float>(std::atof(GetLastParameter(pos, data).c_str())); // On récupère le dernier paramètre, délimité par le caractère "saut de ligne" std::cout << "Ennemy loaded, pos = " << pos <<", ennemy_name = " << ennemy_name << ", temps = " << time << ", x = " << x << ", y = " << y << ", angle = " << angle << std::endl; // Affichage du résultat }
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8 // Fonction pour placer le curseur sur le paramètre suivant void Stage::NextParameter(int &pos, std::string &data) { int temp = pos + 1; pos = data.find('|', temp); std::cout << "pos = " << pos << std::endl; }
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 // Fonction pour lire le paramètre actuel, délimité par un "|" std::string Stage::GetParameter(int pos, std::string &data) { return data.substr(pos+1, data.find('|') - pos - 1); }Voila, � partir de ce code, je lis donc mon fichier. Dans mon fichier, j'ai ceci :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 // Fonction pour lire le dernier paramètre, délimité par un "saut de ligne" std::string Stage::GetLastParameter(int pos, std::string &data) { return data.substr(pos+1, data.find('\n') - pos - 1); }
Et mes std::cout m'affiche ceci :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 ENNEMY:megathron|7.0|250.0|-200.0|270.0 ENNEMY:megathron|8.0|100.0|-200.0|270.0 ENNEMY:megathron|9.0|500.0|-200.0|270.0
Le bug viens sur les derniers parametres, qui se retrouve avec une position -1. Si jme souviens bien, c'est la valeur de retour lorsque le std::string::find() ne trouve pas le caract�re souhait�, pourtant, � cette position, le caract�re est pr�sent dans les lignes qui suivent.
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 pos = 16 pos = 20 pos = 26 pos = -1 // Problème ! La position devrait être à 30 et des poussières Ennemy loaded, pos = -1, ennemy_name = megathron, temps = 7, x = 250, y = -200, angle = 0 pos = 16 pos = 20 pos = 26 pos = -1 // Pareil Ennemy loaded, pos = -1, ennemy_name = megathron, temps = 8, x = 100, y = -200, angle = 0 pos = 16 pos = 20 pos = 26 pos = -1 // Pareil Ennemy loaded, pos = -1, ennemy_name = megathron, temps = 9, x = 500, y = -200, angle = 0
Si vous avez une id�e, je suis preneur.
(Au passage, si vous avez une proposition � me faire pour am�liorer ma r�cup�ration de param�tre, par un autre objet de la biblioth�que standard ou quoi, je suis aussi preneur. :p)
Partager