Débutant en C++, j’apprends avec le tuto "Programmez avec le langage C++". J'en suis à l'étape du TP "Mot mystère".
J'ai réussi à développer toutes les fonctionnalités du jeu mais j'ai un souci avec l'étape additionnelle du "dictionnaire".
J'importe le fichier "dico.txt", celui-ci est bien chargé par mon script. Je fais une boucle qui va parcourir le fichier et sélectionner le mot en fonction d'un numéro de ligne aléatoire.
Le mot est bien sélectionné, mais je voudrais l'afficher entre guillets dans une sortie console, je suis donc obligé d'échapper les guillemets qui entourent le mot, et là j'ai un soucis avec la sortie, non seulement les guillemets de fermeture ne sont pas présents, mais en pus de çà cela me supprime le premier caractère de la chaîne.
Je vous propose de jeter un œil à mon code ci-dessous :
int main() {
//Initialisation
ifstream dico_file("dico.txt");
int dico_counter(0);
int dico_index(0);
bool dico_stop(false);
string mot_mystere_original("");
string mot_mystere("");
string quoted("");
while(play == true) {
//Sélection du mot dans le dico
mot_mystere_original = "";
mot_mystere = "";
mot_melange = "";
if(dico_file) {
mot_mystere_original = "";
dico_counter = 1;
dico_index = rand() % NB_LIGNES_DICO;
while(getline(dico_file, mot_mystere_original) && dico_stop == false) {
if(dico_counter == dico_index) { dico_stop = true; }
else { dico_counter++; }
}
}
else {
cout << "ERREUR : Impossible d'ouvrir fichier le dictionnaire" << endl;
play == false;
}
cout << mot_mystere_original << endl;
mot_mystere = mot_mystere_original;
quoted = "\"" + mot_mystere_original + "\"";
/*
output = "ADMIN : Le mot à deviner sera : \"";
output+= mot_mystere_original;
output+= "\"";
cout << output << endl;
*/
cout << quoted << endl;
cout << "ADMIN : Le mot à deviner sera : " << quoted << endl;
return 0;
}
}
J'ai essayé de concaténer ma chaîne de différentes manière mais j'ai toujours la même erreur.
Je n'ai pas le problème si je met la valeur de "mot_mystere_original" en dur ou si je la récupère via un "cin".
Est-ce que quelqu’un aurait des pistes à me proposer ?
C'est mes lunettes, ou la variable "play" n'est pas déclarée ?
Si ça ne concatène pas bien, c'est que les données à concaténer ne sont pas bonnes.
Conseil : pour débugger, faire afficher les données dès qu'elles sont lues.
En fait la variable "play" est bien déclarée, c'est juste que normalement mon code est plus conséquent, j'ai fait un peu de ménage pour ne poster que l’essentielle est la variable a été malencontreusement effacée.
Je pense que le problème peut effectivement venir du fait que la variable "mot_mystere_original" est une chaine bancale... j'aimerais afficher les données dès qu'elles sont lues, mais commet procéder ??
Parallèlement à çà, je vais remplacer mon While par un For.
pour afficher : avec std::cout << ma_chaine << std::endl;
On peut d'ailleurs faire plus court et plus simple
int dico_index = rand() % NB_LIGNES_DICO;
string mot_mystere;
for (int i = 0; i <= dico_index ; i++) {
getline(dico_file, mot_mystere);
}
Conseil : si on veut s'occuper du cas où les lectures échouent, il est préférable de lever une exception plutot que de trimballer/tester partout des indicateurs.
la fonction std::getline() sait lire une ligne, elle élimine automatiquement un éventuel caractère '\n'. Attention si le fichier lu a été écris sous Windows et qu'il est utilisé par exemple sous Linux, un caractère supplémentaire '\r' sera lu à la fin des lignes (sous Windows il est ôté en même temps que le '\n' pour peu que le stream ne soit pas en mode binaire). C'est peut-être ce caractère qui perturbe. Dans ce cas il faudrait soit convertir le fichier, soit filtrer les caractères de contrôles inopportuns.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.