Partage
  • Partager sur Facebook
  • Partager sur Twitter

lire une ligne dans un .txt de façon aléatoire

29 septembre 2014 à 9:48:02

#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 :)

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2014 à 9:54:48

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.

Bonne journée.

  • Partager sur Facebook
  • Partager sur Twitter

Mes articles | Nazara Engine | Discord NaN | Ma chaîne Twitch (programmation)

29 septembre 2014 à 11:32:38

Forcément, la taille de mon fichier ne va pas m'aider (boulet Inside).

Il me reste donc a travailler sur les tableaux dynamique. "Je comprend vite mais il faut m'expliquer longtemps".

Merci pour ton aide!

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2014 à 16:23:01

tableaux dynamiques ???

Non, avec un std::vector<std::string>.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
29 septembre 2014 à 19:16:13

La classe std::vector a le comportement d'un tableau dynamique.
  • Partager sur Facebook
  • Partager sur Twitter
Because ninjas are fast an reliable.
29 septembre 2014 à 19:28:32

Malheureusement, avec le tutoriel pourri d'OC, les débutants désignent tableau dynamique les tableaux créés à coup de new.

-
Edité par bacelar 29 septembre 2014 à 19:29:01

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
20 novembre 2014 à 10:03:43

#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

  • Partager sur Facebook
  • Partager sur Twitter
Boubouxe
20 novembre 2014 à 10:11:40

Lu'!

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.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

20 novembre 2014 à 10:52:50

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^^.

  • Partager sur Facebook
  • Partager sur Twitter
Boubouxe
20 novembre 2014 à 11:07:31

boss333372 a écrit:

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).

Deux trois conseils avant t'attaquer Qt :

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.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

20 août 2015 à 18:45:33

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.

-
Edité par boss333372 20 août 2015 à 18:47:28

  • Partager sur Facebook
  • Partager sur Twitter
Boubouxe
6 août 2021 à 19:16:35

  • #include <iostream>
    #include <string>
    #include "randomWord.h"
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    int main() {
    
    	std::cout << "*********************************\n*        BEGIN GAME....         *\n*                               *\n*                               *\n*                               *\n*********************************\n";
    	srand(time(0));
    	char choice;
    	vector <string> scores;
    	int j(1);
    	string computer, player2Word;
    	string const nomFichier("C:\\Users\\user\\Downloads\\Compressed\\dico\\dico.txt");
    	ifstream fout(nomFichier.c_str());
    	do {
    		int inRandom = rand() % 323578;
    		int test(5);
    		if (fout)
    		{
    			int j = -1;
    			while (getline(fout, computer) && j != inRandom) {
    				j++;
    			}
    		}
    		else {
    			std::cout << "Impossible de lire le fichier!\n";
    			std::cout << "Input a word : ";
    			cin >> computer;
    			std::cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    		}
    		string myMixerWord = mixerWord(computer);
    
    		do {
    			std::cout << "What's the mystery word ? " << myMixerWord << endl;
    			cin >> player2Word;
    			if (player2Word != computer) {
    				std::cout << "It's not the word!\n";
    				--test;
    				std::cout << "You have " << test << " test.\n";
    			}
    		} while (player2Word != computer && test != 0);
    
    		if (player2Word == computer) {
    			scores.push_back(computer);
    			std::cout << "Congratulations you are find the word!\a";
    		}
    		std::cout << "The correct word is : " << computer << endl;
    		std::cout << "Do you want to replay? (o/n) ";
    		cin >> choice;
    	} while ((choice == 'o' || choice == 'O')? j++, true: false);
    	std::cout << "\n\nEND GAME!!!\n";
    	std::cout << "Your are find " << scores.size() << "/" << j << " Words\n***********************************\n";
    }
     
     
ça marche à 100%.

-
Edité par FakoroTraore 6 août 2021 à 19:19:19

  • Partager sur Facebook
  • Partager sur Twitter
6 août 2021 à 19:44:37

@FakoroTraore Bonsoir, merci de ne pas déterrer d'ancien sujet.

Déterrage

Citation des règles générales du forum :

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.

  • Partager sur Facebook
  • Partager sur Twitter