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