#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand(time(0)); //init de la fonction aléatoire
ifstream dictionnaire("C:/Users/user/Documents/C++/dico/dico.txt");
dictionnaire.seekg(0, ios::end); //calcul de la taille du fichier .txt
int taille=dictionnaire.tellg();
if (dictionnaire)
{
int ligneAleatoire(0); //selection aléatoire d'une ligne dans dico.txt
ligneAleatoire=rand()%taille;
cout<<ligneAleatoire<<endl; //affichage du numéro de la ligne
string motAleatoire;
getline(dictionnaire, motAleatoire);
cout<<motAleatoire<<endl;
}
else
{
cout<<"Erreur de lecture"<<endl;
}
}
Bonjour,
Je débute en C++ et suis le cours sur OC. J'en suis au TP "mot mystère", j'ai réussi pour l'instant à le faire et à ajouter un nombre de coup maximum, ainsi que l'affichage du score lors de partie entre 2 joueurs. Maintenant j'essaye d'utiliser un fichier dictionnaire (celui proposé dans le TP) pour sélectionner aléatoirement un mot et l'afficher.
Ma fonction aléatoire fonctionne, le programme ouvre le dictionnaire, compte le nombre de ligne, en choisi une aléatoirement et m'affiche son numéro dans la console (ça, c'est juste pour voir si tout fonctionne pour l'instant).
Là ou je sèche, c'est comment dire à mon programme de lire la ligne numéro X qui à été déterminé par la fonction aléatoire?
J'ai essayer avec un getline mais n'y suis pas arriver. J'ai chercher mais je doit loupé quelque chose car je n'arrive pas à afficher mon texte. Je n'ai que le numéro de ma ligne. J'ai comme l'impression qu'il me manque des arguments.
Si quelqu'un pouvais m'expliquer ce qu'il manque! Merci par avance
Déjà, tu te trompes en croyant connaître le nombre de lignes, ce que ton code calcule c'est la taille du fichier (le nombre de caractères).
Sur le fichier ci-dessous, il renverrait un nombre proche de 11 (en comptant les retours à la ligne), mais il n'y a pourtant que trois lignes n'est-ce pas ?
Ligne 1
2
3
Donc concrètement, les streams n'ont aucune notion de positionnement par ligne, tu es obligé de lire tout le fichier pour savoir combien de lignes font parties du fichier.
Cependant, la solution la plus simple est souvent la meilleure: Lit ton fichier avec une boucle sur getline et ajoute chaque ligne à un vector.
De cette façon, tu auras le nombre de lignes, pourra tirer un nombre au hasard et y accéder directement.
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
string choixMot()
{
vector<string> mots;
string ligne, motAleatoire;
ifstream fichier("test/Mysteri-letters/dico.txt");
if(fichier)
{
fichier.seekg(0, ios::beg);
while(getline(fichier, ligne))
{
mots.push_back(ligne);
}
//On mélange les mots du tableau
random_shuffle(mots.begin(),mots.end());
motAleatoire= mots[0];
}
else
{
cout << " Desolee une erreur est survenu avec l'ouverture du fichier dico.txt" << endl ;
}
fichier.clear();
fichier.close();
return motAleatoire;
}
string melangerLettres(string mot)
{
string melange;
int position(0);
// Tant que nous n'avons pas extrait toutes les lettres du mot
while (mot.size() != 0)
{
// On choisit un numéro de lettre au hasard dans le mot
position = rand() % mot.size();
// On ajoute la lettre dans le mot mélangé
melange += mot[position];
// On retire cette lettre du mot mystère pour ne pas la prendre une 2e fois
mot.erase(position, 1);
}
// On renvoie le mot mélangé
return melange;
}
int main()
{
string motMystere, motMelange, motUtilisateur;
int position(0);
bool continuer(false);
int restart;
do
{
srand(time(0));
motMystere = choixMot(); // Appel de la fonctions motMystere; Ta Ligne est ici GUIZMAX!!
motMelange = melangerLettres(motMystere); //Appel de la fonction melangelettre
cout << " Bienvenu dans Mysterie letters " << endl << " A votre avis quel est-ce mot ? " << motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere) // condition Utilisateur et incrementation du booleen par l'intermediaire d'une variable int
{
cout << " Bravo ! Vous avez trouver la solution " << endl << " Voulez-vous recommencer une partie ? " << endl << " Si oui taper le chiffre 1 sinon taper 0" << endl;
cin >> restart;
}
else
{
cout << " Ce n'est pas le mot !Allons un peu de ferveur ! "<< endl << " Souhaiter vous continuer 1(oui) sinon 0(non) ? " << endl;
cin >> restart;
}
if(restart == 1) // si variable int restart alors booleen est true ou false
{
continuer = true;
}
else if(restart == 0)
{
continuer = false;
}
else
{
cerr << " Lol Petit plaisantin soit 1 pour continuer ou 0 pour arreter " << endl; // si autre que 1 et 0 affiche ceci
cin >> restart;
}
}while(continuer); // On recommence tant qu'il n'a pas trouve
return 0;
}
Salut je vien de terminer aussi le tp mystere et j'ai eu la meme galere que toi donc si ca peu t'aider voila mon code effectivement les tableaux dynamique permette de bien recuperer le resultat et surtout le melange pour moi des mots et la fonction aleatoire qui en decoule et je t'ai indiquer la ligne qui permet l'affichage ou autre.
d'ailleur:
motMystere = choixMot();
voila donc faudrait isoler ta partie aleatoire dans une fonction et tu rajoute cette ligne dans le int main.
En modifiant a ta sauce
- Edité par boss333372 20 novembre 2014 à 10:19:25
Pourquoi recharger le fichier à chaque fois que tu as besoin d'un mot ? Charge le une fois en début de programme et pioche dedans chaque fois que tu as besoin d'un mot.
Pré-déclarer les variables c'est le meilleur moyen d'introduire des bêtises quand on fait grossir un code. Déclare tes variables dans la portée où elle est nécessaire et le plus tard possible.
Tu réinitialises la graine du générateur aléatoire à chaque tour de boucle, ce qui fait qu'il n'est plus vraiment aléatoire. Par ailleurs depuis la norme 2011, il y a le header <random> en C++.
Ta demande de restart ne fait pas ce que tu veux, réfléchis mieux à ton algorithme.
merci pour tes precision ba de toute facon je cherche a m'ameliorer, j'etais tous content que le code fonctionnent et je suis debutant cela fait une semaine que j'apprend, je compte justement apprendre le qt avec ce petit programme la je vais rajouter un score et un nombre d'essais avant d'attaquer qt .
donc en gros faudrais que je declare une variable string en indiquant le chemin du ifstream a cette variable et rajouter aprés seulement if(nom_fichier.c_cstr)ou nom fichier fin je voit ce que tu veux dire je vais y reflechir bonne journée^^.
merci pour tes precision ba de toute facon je cherche a m'ameliorer, j'etais tous content que le code fonctionnent et je suis debutant cela fait une semaine que j'apprend, je compte justement apprendre le qt avec ce petit programme la je vais rajouter un score et un nombre d'essais avant d'attaquer qt.
Une semaine de C++ et attaquer Qt, c'est un bon moyen de courir droit dans un mur. Essaie plutôt de faire plusieurs projets simples avant. Typiquement, si tu es pas loin de la partie sur Qt, ça veut dire que tu as vu toute la partie sur les classes ce qui veut dire que tout ce qui est avant doit être parfaitement assimilé. Autant te dire que normalement ton code sur le pendu devrait être parfait (à peu de choses près).
Qt n'est vraiment pas une partie facile, surtout quand on ne connaît pas les boulettes courantes que l'on peut faire en C++.
boss333372 a écrit:
donc en gros faudrais que je declare une variable string en indiquant le chemin du ifstream a cette variable et rajouter aprés seulement if(nom_fichier.c_cstr)ou nom fichier fin je voit ce que tu veux dire je vais y reflechir bonne journée^^.
Beaucoup plus simple : tu remplis ton vector en début de programme et tu oublies ton fichier.
hey ca date j’avoue que jetais trop presser d'avoir mon premier programme avec interface graphique puis c++ fut mon premier langage en plus je venait de débuter donc forcement y'avait des incohérence mais bon on ne fait pas d'omelette sans casser des œufs.Et non cest dommage joublie jamais rien et quand je veux quelque chose je vais jusq'au bout.
J’avoue rien ne sert de courir et quand on comprend pas un truc il faut bein relire et connaitre les base parfaitement aide et fait gagner beaucoup de temps.
Et j’ajoute qu'avant de se lancer a un projet il faut aussi bien choisir les langages que l'on veut et peut utiliser.
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
Mes articles | Nazara Engine | Discord NaN | Ma chaîne Twitch (programmation)
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C