Generer un ligne d'enregistrement d'un fichier

Résolu
Signaler
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007
-
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007
-
Salut

Je crée actuellement un jeu ludoeducatif pour enfants avec des questionnaires, j'ai enregistré mes questions et réponses dans un fichier de la manière suivante :


static void Main(string[] args)


{


// Creation du Fichier


FileStream fich = new FileStream("questionnaire.txt", FileMode.Append);


StreamWriter quest = new StreamWriter (fich);


// Inscription automatique quand WriteLine


quest.AutoFlush = true;


Console.WriteLine("Voulez vous inscrire une question et une réponse ?");


string s1;


do


{ //Enregistrement du numero de la question


Console.Write ("Entrez le numéro de la question : ");


quest.WriteLine (Console.Read() + ';');


//Enregistrement de la Question


Console.WriteLine ("Inscrivez la question");


quest.Write(Console.ReadLine() + ';');


//Enregistrement de la Réponse


Console.WriteLine ("Inscrivez la réponse");


quest.Write (Console.ReadLine() + ';');


//Autre enregistement à effectuer ?


Console.WriteLine ("Voulez vous enregistrer une autre question ?");


s1 = Console.ReadLine();


}


while (s1.ToLower() == "oui") ; //


quest.Close(); // Fermeture du Fichier


}


Dans mon jeu, je desire generer aleatoirement une ligne du fichier c'est à dire son numero, sa question et sa reponse que je vé ensuite décomposer, pour la décomposition c'est bon je sé now comment faire grâce à MorpionMx mais nulle part j'ai trouvé comment generer une ligne de mon fichier aleatoirement à chaque ouverture du jeu.
Quelqu'un saurait-il le faire ?

Merci d'avance
Maiku

11 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Le ReadToEnd() sert a lire le flux jusqu'a la fin, donc il lit toutes les lignes.

pour recuperer la propriété length, tu fais juste strQuests.Length . Tu aura ainsi la taille de ton tableau.

Ensuite, fait comme Wormkeyp te dis :



En resumé :

System.Random MyRandom=new System.Random();

...


StreamReader sr = new StreamReader("Questionnaire.txt");

string str = sr.ReadToEnd();

string[] strQuests = str.Split('\n');


int Valeur=MyRandom.Next(strQuest.Length - 1);

string laQuestion = strQuests[Valeur]; // Choisi une question

string[] qr = laQuestion.Split(';');



et ainsi, tu as qr[0] = la question, et qr[1] = la reponse.



Attention, tout ca c'est pas optimisé. Et oublie pas de gerer les erreurs, ...

Voila voila.


Mx
Messages postés
20
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Si j'ai bien compris tu veux réupérer aléatoirement une question de ton fichier.

Pour générer un nombre aléatoire il faut utiliser ce qui suit:
System.Random MyRandom=new System.Random();
int Valeur=MyRandom.Next(Valeur_Maximale);

Tu utilisera la taille de l'array des question comme Valeur_Maximale
Valeur serra l'index choisi aléatoirement

numero[Valeur] //Ton numero de question
question[Valeur] //Ta question

J'aurrais pu être plus explicite si tu aurrais donné tes nom de variables. J'espère que tu pourra te débrouiller avec ça.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
A la barbare :



StreamReader sr = new StreamReader("Questionnaire.txt");

string str = sr.ReadToEnd();

string[] strQuests = str.Split('\n');



Avec ca, tu recuperes chaque ligne séparée dans le tableau strQuests

Ensuite, tu as plus qu'a utiliser une fonction de generation de nombre
aléatoire avec comme nombre maximal, la propriété Length de ton tableau
pour tirer au sort la question, et la suite, tu sais faire



Y'a peut-etre une meilleure manière bien sur, la j'ai fait vite fait.


Mx
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Alors je m'adresse a mon copain MorpionMx que je vé venerer pour toutes ses rep.
Quelques petites questions :
- Ton .ReadToEnd : il sert a quoi ?
- Si j'ai bien compris : string[] strQuests = str.Split('\n'); est un tableau donc
- la propriété Lenght : je sé pa l'utiliser suis debutante en fichier moi T_T
- le reste j'ai pas tt compris avec l'histoire de tableau

En fait now j'ai un numero de question, une question et une reponse : de quelle maniere je les stocke ?
Et comment les recuperer une par une si possible ?

Maiku
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Je remplace MorpionMx

1) Il sert à lire le Stream (ton file) jusqu'à la fin.
2) Oui c'est un tableau qui contiendra chaque ligne du fichier
3) La property lenght te permet de savoir combien il y a d'élément dans ton tableau (donc de lignes dans ton fichier)

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Alors dsl de ne pa avoir donné suite mais entre les cours, le code, le bts, les pti et les stages, le tps vient a manquer.
J'ai mis en pratique la solution de Morpion MX, qui marche très bien a une exception pres.
Comment faire quand par ex tu joué une fois tt les jeux donc tu ferme et tu reouvre le jeu, c'est alors les mm questions qui apparaissent du début a la fin alors que le debut c'est de les avoir aleatoirement comme ds un pendu par ex sauf que ce n'en est pas un^^

Si qq pouvait m'aider a corriger ce petit dysfonctionnement^^

Maiku
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Pour mieux expliquer je vé mettre une partie de mon code :


//Ouverture du fichier Animaux :


Console.WriteLine ("Thème : Les Animaux");


FileStream anim1 = new FileStream("animaux.txt",FileMode.Open,FileAccess.ReadWrite);


// flux de lecture du fichier :


StreamReader anim = new StreamReader (anim1);


// Generation aléatoire d'une question


Random ag1 = new System.Random();


aq = anim.ReadToEnd ();


string[] a1 = aq.Split('\n');


Valeur= ag1.Next(a1.Length - 1);


laQuestion = a1[Valeur]; // Choisit une question


string[] aq1 = laQuestion.Split(';'); // Decoupe la question


Console.WriteLine ("Question n°1 : ");


Console.WriteLine (aq1[0]);


reponse = Console.ReadLine();


if (reponse == aq1[1])


{gainpos();}


else


{gainneg();}


// Generation aléatoire d'une question


Random ag2 = new System.Random();


aq = anim.ReadToEnd ();


string[] a2 = aq.Split('\n');


Valeur= ag2.Next(a2.Length - 1);


laQuestion = a1[Valeur]; // Choisit une question


string[] aq2 = laQuestion.Split(';'); // Decoupe la question


Console.WriteLine ("Question n°1 : ");


Console.WriteLine (aq2[0]);


reponse = Console.ReadLine();


if (reponse == aq2[1])


{gainpos();}


else


{gainneg();}


// Generation aléatoire d'une question


aq = anim.ReadToEnd();


string[] a3 = aq.Split('\n');


Valeur=MyRandom.Next(a3.Length - 1);


laQuestion = n3[Valeur]; // Choisit une question


string[] aq3 = laQuestion.Split(';'); // Decoupe la question


Console.WriteLine ("Question n°3 : ");


Console.WriteLine (aq3[0]);


reponse = Console.ReadLine();


if (reponse == aq3[1])


{gainpos();}


else


{gainneg();}


anim.Close();

Donc dans mon cas il me generer 3 questions dans l'ordre qu'elle apparaissent ds le fichier mais moi je voudrais que ce soit aleatoire.

Maiku

Maiku
Messages postés
20
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Je crois avoir la réponse a ta question. J'ai lu que la classe "Random" utilise
pour générér des nombres aléatoires un "seed" (=graine). C'est a dire que si tu lui donne
le même "seed" au démarage, il te sortira la même suite de nombres pseudo aléatoires.

Lorsque tu crée ton instance de "Random" tu le fais de la façon suivante:
Random ag1 = new System.Random();

A mon avis il prend toujours le meme "seed", je te conseille d'utiliser la méthode suivante:
int seed=DateTime.Now.Millisecond;

Random ag1 = new System.Random(seed);

Comme DateTime.Now.Millisecond change a chaque lancement de programme ton problème
serra probablement reglé.

/!\ La prochaine foix que tu expose ton problème sur le forum exprime toi plus clairement, j'ai mis
un bout de temps a comprendre.
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Bonjour

Alors j'ai mis en place la seed de la façon suivante :

//Ouverture du fichier Nourriture :


FileStream nour1 =
new FileStream("nourriture.txt",FileMode.Open,FileAccess.ReadWrite);



// flux de lecture du fichier :


StreamReader nour =
new StreamReader (nour1);



// Generation aléatoire d'une question



int seed=DateTime.Now.Millisecond;


System.Random gen1=
new System.Random(seed);



// Lit le fichier du début a la fin



string nq = nour.ReadToEnd();



//Decoupe le fichier en 2 string



string[] n1 = nq.Split('\n');



int Valeur=gen1.Next(n1.Length - 1);



string laQuestion = n1[Valeur];
// Choisit une question



string[] nq1 = laQuestion.Split(';');
// Decoupe la question


Console.WriteLine ("Question n°1 : ");


Console.WriteLine (nq1[0]);


reponse = Console.ReadLine();



if (reponse == nq1[1])


{


gainpos();


}



else


{


gainneg();


}



// Generation aléatoire d'une question


seed=DateTime.Now.Millisecond;


Random gen1 =
new System.Random(seed);


nq = nour.ReadToEnd();



//Decoupe le fichier en 2 string



string[] n2 = nq.Split('\n');


Valeur=gen1.Next(n2.Length - 1);


laQuestion = n2[Valeur];
// Choisit une question



string []nq2= laQuestion.Split(';');
// Decoupe la question


Console.WriteLine ("Question n°2 : ");


Console.WriteLine (nq2[0]);


reponse = Console.ReadLine();



if (reponse == nq2[1])


{


gainpos();


}



else


{


gainneg();


}



// Generation aléatoire d'une question


seed=DateTime.Now.Millisecond;


Random gen3 =
new System.Random(seed);


nq = nour.ReadToEnd();



//Decoupe le fichier en 2 string



string[] n3 = nq.Split('\n');


Valeur=gen1.Next(n3.Length - 1);


laQuestion = n3[Valeur];
// Choisit une question



string[] nq3 = laQuestion.Split(';');
// Decoupe la question


Console.WriteLine ("Question n°2 : ");


Console.WriteLine (nq3[0]);


reponse = Console.ReadLine();



if (reponse == nq3[1])


{


gainpos();


}



else


{


gainneg();


}


nour.Close();

La question générer au départ est pourtant la même a chaque lancement. De plus, il refuse de me générer ma deuxieme et troisième question car je dois en générer 3 consécutivement dans le programme.
Quelqu'un aurait il une solution ?

Désolée si mon explique n'était pas assez explicite mais moi même je m'y perd des fois.

Maiku
Messages postés
20
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Pour que la première question soit différente a chaque foix:

Lis ça pour comprendre Random.Next(..)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRandomClassNextTopic1.asp
En fait l'argument donné a Random.Next(..) n'est pas la valeur maximale
que l'on peut atteindre, mais la valeur a ne pas dépasser. Donc si tu
fais Random.Next(2) il ne te sortira que 0 ou 1 comme nombre aléatoire.

La ligne de l'erreur est donc:
int Valeur=gen1.Next(n1.Length - 1);
A remplacer par:
int Valeur=gen1.Next(n1.Length);

Pourquoi tes 2èmes et 3èmes questions ne marchent pas:

Tu a utilisé la fonction ReadToEnd(), il te faut savoir que au fur et a mesure
que tu lis dans le "stream" (=flux) un curseur avance pour t'éviter d'avoir toujours
a lire la même chose. Avec ReadToEnd() ce curseur est donc placé a la fin du
stream ce qui t'empèche de pouvoir le relire.

Mon Conseil: Evite de faire 20 foix une opération que tu peux ne faire qu'une seule
foix.

Donc jusqu'a la ligne avec:
string[] n1 = nq.Split('\n');
Tu n'a pas besoin de répeter ces opérations! une foix suffit!

Wormkey
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Lut


J'ai compris disons a moitié tes explications :


- alors pk je genere 3 questions et trois rep c'est pour un question


- par contre je n'ai pas bien compris ce qu'il faut supprimer j'ai supprimer les 2
aq = aq.ReadToEnd(); en trop donc.
-Mais pour les random je dois aussi les supprimer ?!! parce que c'est eux qui generent des trucs diff non ?

Merci d'avance
Maiku