Récupération d'un mot aléatoire depuis un fichier texte [Résolu]

Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
- - Dernière réponse : BunoCS
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
- 28 déc. 2010 à 09:30
Bonjour à tous. Voilà je vous explique mon problème. J'aimerais faire un petit programme qui permet de récupérer un mot aléatoirement dans un fichier texte puis de demander à l'utilisateur si ce mot est féminin ou masculin (réponse qui sera au préalable inscrite aussi dans le fichier texte). Ma question est donc : comment récupérer un mot aléatoirement (ou plus précisément une ligne de mon fichier texte) ?

Merci d'avance pour vos réponses.
Afficher la suite 

Votre réponse

20/24 réponses

Meilleure réponse
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
2
Merci
De rien, c'est mon boulot
Au fait, n'oublies pas de cliquer sur "Réponse Acceptée"

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de BunoCS
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
1
Merci
Pour récupérer une ligne dans un fichier texte, tu peux utiliser "fgetline".
"srand" te permet d'initialiser le générateur de nombre aléatoire (à n'appeler qu'une seul fois au début de ton main), et "rand" te permet d'obtenir un nombre aléatoire.

A partir de ces 3 informations, il devrait être aisé pour toi de réaliser ce que tu veux. Si tu es bloqué, poste ton code pour qu'on le corrige/améliore.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
1
Merci
Désolé de ne répondre que maintenant mais j'avais d'autre trucs à faire récemment donc j'avais un peu laisser tomber ce projet.

Merci de ta réponse CptPingu. J'ai essayé d'utiliser ta fonction mais j'ai pas réussi à l'utilisé correctement. Je met mon code pour que ce soit plus simple.

Main :
int main()
{
char mot;
char ligne;
int position_espace;

ligne = chargerMot();
//position_espace = strrpos(ligne, " ");

printf(mot + "\n");
return 0;
}

Fonction chargerMot:
char chargerMot()
{
FILE* fichier = NULL;
int ligne;
int i = 0;
char mot;


srand(time(NULL));
ligne = rand();
//chiffre pris au hasard par l'ordinateur

//ligne = 2;

fichier = fopen("listeMot.txt", "r");
if (fichier == NULL)
return "";

else
{
mot = fgetln(fichier, ligne);
fclose(fichier);
return mot;
}
}
Commenter la réponse de mornaloce
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
1
Merci
Yop!
Sauf erreur de ma part, rand) retourne une valeur entre 0 et 1. Il faut donc multiplier cette valeur par le nombre de lignes

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
1
Merci
Apparemment non ça ne renvoie pas une valeur entre 0 et 1 mais ça peut renvoyer n'importe quoi donc il faut quand même que je le limite au nombres de lignes qu'il y a dans mon fichier, tu saurais comment faire ?

Sinon à part ça quand je compile mon code ça me renvoie des erreurs sur le fgetln.
Commenter la réponse de mornaloce
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
1
Merci
Entre 0 et "rand max" avec rand max qui vaut au moins 32767.
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Merci pour l'info CptPingu. J'ai réussi (enfin je pense) à utiliser le rand comme je le voulais. mais j'ai toujours une ereur sur la fonction que tu m'a proposé,soit : fgetln ou fgetline c'est pareil. En fait ce n'est pas reconnus par mon IDE car les deux fonctions ci dessus ne sont pas intégrées dans mon stdio.h

Je me suis donc rabattu sur la fonction fgets mais je n'arrive pas bien à comprendre comment l'utiliser, pourrais-tu me renseigner ?
Voilà mon code modifier pour la fonction chargerMot():
char chargerMot()
{
FILE* fichier = NULL;
int ligne = 0;
int i = 0;
int j = 0;
char mot = NULL;
int nb_ligne = 0;
int c = 0;
char recup = NULL;

srand(time(NULL));

fichier = fopen("listeMot.txt", "r");
if (fichier == NULL)
return NULL;

else
{
while((c = fgetc(fichier)) != EOF){
if(c == '\n')
{
++nb_ligne;
if(i > j)
j = i;
i = 0;
}
else
i++;
}
++nb_ligne;
if(i > j)
j = i;
i = 0;

//chiffre pris au hasard par l'ordinateur
ligne = rand() %nb_ligne + 1;
if (ligne == 0)
ligne = 1;

fgets(mot, j, fichier);

fclose(fichier);
return mot;
}
}
Commenter la réponse de mornaloce
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Bon y a personne pour m'aider alors ?
Commenter la réponse de mornaloce
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
J'avais oublié que fgetline n'était pas portable. Il est présent sur les compilateurs gcc sous Unix.

Tu peux néanmoins récupérer une fonction fgetline ici:
http://www.cpax.org.uk/prg/writings/fgetline.c
http://www.cpax.org.uk/prg/writings/fgetdata.h

Ça te permettra d'avancer.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
Sinon, fgets()

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Oui j'ai utilisé fgets() justement buno. Mais je n'arrive pas à l'utiliser comme il faut, comme tu peux le voir dans mon code, malgré être allé voir sur certain sites. Donc j'aurais aimé savoir comment l'utilisé correctement afin de récupéré la valeur de ma ligne du fichier texte dans ma variable "mot".
Commenter la réponse de mornaloce
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
#include <stdio.h>

int main()
{
   FILE * pFile;
   char mystring [100];

   pFile = fopen ("myfile.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     fgets (mystring , 100 , pFile);
     puts (mystring);
     fclose (pFile);
   }
   return 0;
}


Ce code récupère les 100 premiers caractères du fichier ou bien la 1ère ligne (selon la condition qui arrive en 1er)

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Bizarre j'ai fait la même chose mise à part pour la gestion de l'erreur puisque moi je renvoie null s'il y a une erreur mais pourtant ça ne fonctionne pas. La fonction fgets ne récupère rien dans mon fichier. La console m'affiche une ligne vide. Et ce n'est pas parce qu'il y a un erreur à l'ouverture du fichier car j'ai suivi la progression en mode debbug et l'ouverture du fichier se passe très bien.
Commenter la réponse de mornaloce
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
Peut-on voir les 1ères lignes de ton fichier? Tu as peut-être un retour à la ligne au début
Et si tu boucles sur fgets?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
C'est bon j'ai réussi à m'en sortir finalement. Donc maintenant je récupère une chaine de caractère du style "chat m". Je souhaiterais en sortir deux chaines différentes coupées au niveau de l'espace. C'est à dire : str 1 = "chat" et str 2 = "m". Pour récupérer la position de l'espace je voulais utiliser strrpos() puis substr() pour récupérer mes deux nouvelles chaines mais ces fonctions ne sont pas disponibles dans mon "string.h". Quelles autres fonctions pourrais-je utiliser pour arriver au résultat voulu ?
Commenter la réponse de mornaloce
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Bon j'ai fini par trouver la fonction strtok(). Le problème c'est qu'elle stocke bien ce que je veux mais elle ne me renvoie pas la valeur comme il faut. Je m'explique, voilà mon code :

char ligneRecup[100] = {0};
char tabChaine[] = {0};
char *pch = NULL;
int i = 0;

//On recupère la ligne. Ex : "chat m"
if(!chargerMot(ligneRecup))
exit(0);

//pch prend lavaleur "chat"
pch = strtok (ligneRecup," ");
while (pch != NULL)
{
//tabChaine prend la valeur "1/2" ???
tabChaine[i] = pch;
//pch prend la valeur "m"
pch = strtok (NULL, " ");
i ++;
}

Je tiens à préciser que j'ai vérifier que les variables prenaient bien les valeurs en commentaires. Ce n'est pas juste une supposition.
Commenter la réponse de mornaloce
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
Personne pour m'éclairer ? J'ai essayer de chercher sur des sites mais je n'arrive pas à comprendre l'erreur.
Commenter la réponse de mornaloce
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
tabChaine[i] = pch;

Tu comptes faire quoi avec ça?
Si tu veux copier ta chaine, il te faut utiliser strcpy()

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
53
Date d'inscription
lundi 17 mars 2008
Dernière intervention
21 mars 2014
0
Merci
En fait je comptais récupérer les valeurs "chat" dans tabChaine[0] et "m" dans tabChaine[1]. J'ai viré ça et essayer de faire de ta manière mais ça me renvoie des erreur. J'ai fait ça :
int main()
{
char ligneRecup[100] = {0};
char *genreDuMot = NULL;
char lettre = NULL;
char *pch = NULL;

if(!chargerMot(ligneRecup))
exit(0);
pch = strtok (ligneRecup," ");
printf("Voici le mot : %s", pch);

pch = strtok (NULL, " ");
//ligne où l'erreur survient
strcpy(genreDuMot, pch);

return 0;
}
Commenter la réponse de mornaloce
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
Attention!
Avant d'utiliser strcpy(), il faut que la chaine de destination soit allouée...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.