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

mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 18 nov. 2010 à 16:51 - Dernière réponse : BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention
- 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

24 réponses

Meilleure réponse
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 28 déc. 2010 à 09:30
1
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

Merci BunoCS 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de BunoCS
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 18 nov. 2010 à 17:10
0
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 20 déc. 2010 à 19:53
0
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 21 déc. 2010 à 09:31
0
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 21 déc. 2010 à 15:58
0
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
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 21 déc. 2010 à 16:01
0
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 21 déc. 2010 à 18:31
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 23 déc. 2010 à 01:03
0
Merci
Bon y a personne pour m'aider alors ?
Commenter la réponse de mornaloce
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 23 déc. 2010 à 10:25
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 23 déc. 2010 à 10:29
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 23 déc. 2010 à 12:27
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 23 déc. 2010 à 14:27
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 24 déc. 2010 à 12:30
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 24 déc. 2010 à 12:51
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 24 déc. 2010 à 14:59
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 24 déc. 2010 à 15:30
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 26 déc. 2010 à 16:46
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 27 déc. 2010 à 10:36
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
mornaloce 53 Messages postés lundi 17 mars 2008Date d'inscription 21 mars 2014 Dernière intervention - 27 déc. 2010 à 14:03
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
BunoCS 13897 Messages postés lundi 11 juillet 2005Date d'inscription 19 juin 2018 Dernière intervention - 27 déc. 2010 à 14:34
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.

Récupération d'un mot aléatoire depuis un fichier texte - page 2