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:
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:
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:
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:
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:
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:
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)