J'essaye de générer un fichier de mots classés selon leur valeur en points (style Scrabble)
Pour cela j'utilise une map avec la valeur en points dans first et les mots dans second.
Or plusieurs mots différents peuvent avoir le même score j'ai donc mis les mots du second dans un set.
J'ai donc std::map<unsigned, std::set<std::string> > dico;
Cependant quand je l'utilise ça ne me met dans mon fichier que les deux premiers mots (ceux avec les deux valeurs les plus importantes) mais indéfiniment, le programme génère toujours les deux même lignes...
Merci d'avance à qui saurait me dire où je me suis trompé !
Je dispose de deux fonctions et de deux flux correctement ouverts :
std::string enMaj(std::string); unsigned valeur(std::string); std::ifstream f_in(argv[1], std::ios::in); std::ofstream f_out(argv[2], std::ios::out | std::ios::trunc);Et voici le code de mon programme principal :
std::map<unsigned, std::set<std::string> > dico;
std::string s_in, s_out ,s_trash;
std::getline(f_in,s_trash,'\n'); // suppression de la première ligne
// insertion des données
while (!f_in.eof())
{
std::getline(f_in,s_in,'\t'); // on ne récupère que le premier champ
std::getline(f_in,s_trash,'\n');
s_out=enMaj(s_in);
dico[valeur(s_out)].insert(s_out+"|"+s_in); // format "MOT|mot"
}
// parcours par ordre décroissant des clés
std::map<unsigned, std::set<std::string> >::const_reverse_iterator
i(dico.rbegin()),
n(dico.rend());
for(;i!=n;i--)
{
// parcours par ordre croissant des mots pour chaque clé
std::set<std::string>::const_iterator
j(i->second.begin()),
m(i->second.end());
for(;j!=m;j++)
f_out << *j << '\n';
}
