Désolé, je pense que mon problème va paraître bête, mais je n'arrive pas à m'en dépatouiller, alors voilà, je fais un petit Snake (cmd) en C++, jusque là, rien de bien compliqué, mais j'ai voulu faire un espèce de log pour avoir les 3 meilleures joueurs, du coup j'ai mis un simple .txt à côté et là j'ai un problème :
ifstream logFile ("snake.txt");
string line;
string list [6];
if (logFile.is_open()) {
int i = 0;
while( getline (logFile, line)) {
list[i] = line;
i++;
}
}
else {
cout << "Please replace the missing file 'snake.txt' in the folder."<<endl;
system("pause");
return 0;
}
logFile.close();
cout<<stoi(list[1]);
if ( 10 > stoi( list[1] )){
cout << "Hello World";
}
string player = "";
do {
cout << "Player (12 char max): ";
cin >> player;
} while (player == "");
int score = snake.GetScore();
cout<< stoi(list[1]);
if ( score > std::stoi(list[1]) ) {
list[5] = list[3];
list[4] = list[2];
list[3] = list[1];
list[2] = list[0];
list[1] = score;
list[0] = player;
}
else if ( score > std::stoi(list[3]) ) {
list[5] = list[3];
list[4] = list[2];
list[3] = score;
list[2] = player;
}
else if ( score > std::stoi(list[5]) ) {
list[5] = score;
list[4] = player;
}
J'ai retiré le code superflu, qui ne sert pas pour ça, donc comme vous le voyez, je ne trouve pas théoriquement de problème quand je fais cout << stoi(list[1]);, pas de problème il me renvoie 0 (le score du 1er), mais après quant on en vient aux conditions, j'ai l'erreur
Merci d'avance
PS : Je pensais que ça peut être un problème avec le '\n' à la fin, mais dans ce cas, il ne devrait pas pouvoir le convertir à la base.
Il n'y a pas de '\n' car std::getline() les retire.
Il manque des contrôles dans ce code. - Ligne 8: que se passe-t-il s'il n'y a pas exactement 6 lignes extraites du fichier? On aura ligne[5] qui sera vide ou on aura une mémoire vérolée par une écriture dans ligne[6]! - Tous les accès à std::stoi(). Des données d'origine externes sont toujours à contrôler. Le cas ligne[1] ou ligne[3] ou ligne[5] vide est probable et va indubitablement provoquer une exception. - Ligne 27. Préciser que l'on souhaite moins de 12 caractères c'est bien. Mais il faudrait peut-être vérifier que c'est bien le cas, c'est fou le nombre de personnes inciviles qui justement feront exprès d'en saisir 13, voire des très tordues qui en saisiront 10 millions.
Pour contourner les exceptions de std::stoi(), on peut les 'catcher' ou on peut utiliser une fonction qui n'en produit pas comme std::from_chars() qui n'existe que depuis C++17.
int stoi_securisee( std::string const& s , int valdef=-1 ) { // retourne -1 en cas d'incident
int res = valdef;
try {
res = std::stoi( s );
}
catch ( std::logic_error& ) {
}
return res;
}
D'après ce que j'ai compris, std::stoi, extrait le plus grand entier possible comme succession de chiffre, en retirant les espaces vides les précédant, et arrête l'extraction dès qu'il tombe sur la présence de quelque chose qui n'est plus un chiffre si j'ai compris.
n'hésitez pas à me dire si je peux améliorer ma compréhension
En recherche d'emploi.
Eug