Ok, donc je pars du principe que tu comptes bel et bien coder en C++, alors autant ne pas se priver de ses avantages. (Même si tu as déjà résolu ton problème.)
En fait, l’avantage d’un std::istream
, c’est qu’il permet de lire et interpréter automatiquement les données, par exemple :
| std::ifstream file("a.txt");
float f;
file >> f; // lit le premier nombre du fichier et le stocke dans un float
|
Du coup, plus besoin de s’ennuyer avec atof
et compagnie. Le problème, c’est qu’il lit les nombres séparés par un espace. Or ton fichier est dans un format plus spécifique, et cela ne fonctionnera pas aussi simplement.
Ton code est loin d’exploiter les avantages du C++ (et notamment de sa bibliothèque standard). Trois boucles imbriquées pour simplement lire des valeurs dans un fichier, il y a de quoi se perdre. Aussi, en C++ on utilise std::stof
et non plus atof
qui est une fonction héritée de la bibliothèque C.
Reprenons le problème de base : on veut extraire tous les nombres réels se trouvant entre des chevrons.
Il y a forcément plusieurs moyen d’y parvenir. À mon avis, le plus simple est d’utiliser une expression régulière. Par exemple :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | // on stocke tout le contenu du fichier dans "buf"
std::istreambuf_iterator<char> file_beg(file);
std::istreambuf_iterator<char> file_end{};
std::string buf(file_beg, file_end);
// on définit notre regex
std::regex reg("[\\d.]+(?=.*>)");
// on définit des itérateurs pour parcourir les correspondances
std::sregex_iterator reg_beg(buf.begin(), buf.end(), reg);
std::sregex_iterator reg_end{};
// on définit notre tableau des poids
std::vector<float> poids;
// on transforme les correspondances en float (std::stof)
// et on les insert à la fin de "poids" (std::back_inserter)
std::transform(reg_beg, reg_end, std::back_inserter(poids),
[](auto match){ return std::stof(match.str()); });
|
Ce code fait la même chose que le tiens à la sauce C++, mais en plus de ça, il tient sur cinq lignes et ne comporte aucune boucle.
Note : la regex fonctionne, mais elle pourrait être un peu plus peaufinée.