Tri qleatoire dans un fichier txt progamme c

poulo77 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
poulo77 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je suis entrqin dùecrire un programme en c aui doit lire un fichier txt contenqnt des numero et en prendre un qu hasard dans ce fichier; mqis j'qi quelques q selectionner une ligne qu hqsqrd dqns le fichier. cherche une qme chqritqble pour m'qider merci

voici le code

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>



int main(int argc, char *argv[])
{

printf("entrer le nom de votre fichier\n");
char str[256];
scanf("%s",str);
MaFonction(str);
system("PAUSE");

}

int my_rand (void);
MaFonction(char *NomDuFichier)
{
// fonction d'initialisation
srand ((unsigned)time (NULL));
// le nombre aléatoire que tu veux
int nombre_aleatoire;
// la valeur minimale du nombre

int nb_lignes, lignes ;
char ligne_lue[512], ligne_relue[512];
int borne_sup ;
int borne_inf = 1;

FILE *monfichier;
monfichier = fopen (NomDuFichier,"rb");
if (monfichier != NULL)
{
nb_lignes = 0;
// compter et afficher les lignes du fichier

while( fgets(ligne_lue, 512, monfichier) != NULL){
printf("\t%s", ligne_lue);

nb_lignes++;
}


printf("le fichier %s comporte %d numero\n", NomDuFichier, nb_lignes);
borne_sup = nb_lignes;

printf( "la borne superieure de %s est %d \n", NomDuFichier , borne_sup );


// le tirage : nombre_aleatoire appartient à l'ensemble [borne_inf ,borne_sup]
nombre_aleatoire = borne_inf + (int) ((float) rand() * (borne_sup - borne_inf + 1) / (RAND_MAX+1.0));
printf( "le nombre aleatoire est %d et rnad %d et max %d\n", nombre_aleatoire, rand(), RAND_MAX);
lignes =0;
while( fgets(ligne_relue, 512, monfichier) != NULL){
if(lignes==nombre_aleatoire)
printf("\t%s", ligne_relue);
else{
printf("Impossible \t\n" );
}
lignes++;
}
printf("le numero ganant est le %s \n", ligne_lue);
fclose(monfichier);


}

else
printf("Impossible d'ouvrir le fichier %s\n", NomDuFichier );
printf("V\x82rifiez qu'il est bien dans le m\x88me\n");
printf("r\x82pertoire que l'executable.");
getch();
return 1;
}

et voici le fichier txt
20723734
90492500
90404042
90232334
21883605

merci de votre qide
A voir également:

4 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
A la fin de la première boucle, le pointeur du fichier pointe à la fin du fichier, et, en relançant la boucle, il ne peut plus y avoir d'autre lecture; 2 solutions:
- soit fermer et réouvrir le fichier,
- soit déplacer le pointeur sur fichier sur le début (fonction 'ftell').
NB: Veuillez indenter le code !!!
Bonne continuation.
0
poulo77 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
comment la fonction ftell? montre moi un example.puis-je utiliser fseek
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Oui bien sûr, je me suis trompé; il faut utiliser 'fseek' pour changer la valeur du 'pointeur' de fichier, 'ftell' ne servant qu'à lire la position.
Mille excuses.
0
poulo77 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
ok je fait mais ca se donnede de resultat

fseek(monfichier,0,SEEK_SET);
lignes =0;
while( fgets(ligne_relue, 512, monfichier) != NULL){
if(lignes == nombre_aleatoire)
printf("\t%s", ligne_relue);
else{
printf("Impossible \t\n" );
}
lignes++;
}

la sortie est:
entrer le nom de votre fichier
lotery.txt
20723734
90492500
90404042
90232334
21883605le fichier lotery.txt comporte 5 numero
la borne superieure de lotery.txt est 5
le nombre aleatoire est 1 et rnad 14337 et max 32767
Impossible
90492500
Impossible
Impossible
Impossible
le numero ganant est le 21883605
Vérifiez qu'il est bien dans le même
répertoire que l'executable.

il prend le 2eme numero
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Le résultat me paraît correct; sans doute quelques points à corriger:
- un nombre aléatoire de 1 affiche la 2ème ligne, donc le mini doit être '0' et le maxi doit-être 'nombre de lignes -1',
- il faudrait arrêter la recherche dès que la ligne a été trouvée,
- le calcul de rand me paraît un peu lourd, mais est peut-être juste.
Bonne continuation.
0
poulo77 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
merci des conseil loupis voici le code remodele c'est cool ca coule de source sauf pour le resultat tjrs incrimenter de un pas ta une idee? j'ai changer les borne mais ca ne resout pas le problem.
et puis je me disais ya t-il pas une solution pour garder le resultat du 1er fgets dans un tableau/pointeur et revenir lire apres la colonne qui nous interesse ta pas une idee dessus.
comment revenir au debut de on progame quand on appuit la touche entree au leu que la console dos se ferme

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>



int main(int argc, char *argv[])
{

printf("entrer le nom de votre fichier\n");
char str[256];
scanf("%s",str);
MaFonction(str);
system("PAUSE");

}


MaFonction(char *NomDuFichier)
{
// fonction d'initialisation
srand ((unsigned)time (NULL));
// le nombre aléatoire que tu veux
int nombre_aleatoire;
// la valeur minimale du nombre

int nb_lignes, lignes, rc;
char ligne_lue[512], ligne_relue[512];
int borne_sup ;
int borne_inf = 1;

FILE *monfichier;
monfichier = fopen (NomDuFichier,"rb");
if (monfichier != NULL)
{
nb_lignes = 0;
// compter et afficher les lignes du fichier

while( fgets(ligne_lue, 512, monfichier) != NULL){
printf("\t%s \n", ligne_lue);

nb_lignes++;
}


printf("le fichier %s comporte %d numero\n", NomDuFichier, nb_lignes);
borne_sup = nb_lignes-1;

printf( "la borne superieure de %s est %d \n", NomDuFichier , borne_sup );


// le tirage : nombre_aleatoire appartient à l'ensemble [borne_inf ,borne_sup]
nombre_aleatoire = borne_inf + ( rand()%(borne_sup - borne_inf + 1));

printf( "le nombre aleatoire est %d et rand %d \n", nombre_aleatoire, rand());

fseek(monfichier,0,SEEK_SET);
lignes =0;
while( fgets(ligne_relue, 512, monfichier) != NULL){
if(lignes == nombre_aleatoire){
printf("le numero ganant est: \t%s", ligne_relue);
break;
}
lignes++;
}

fclose(monfichier);


}

else
printf("Impossible d'ouvrir le fichier %s\n", NomDuFichier );
//printf("V\x82rifiez qu'il est bien dans le m\x88me\n");
//printf("r\x82pertoire que l'executable.");

return 0;
}
voici le resultat

entrer le nom de votre fichier
lotery.txt
20723734

90492500

90404042

90232334

21883605

11111111

22222222

33333333

44444444

55555555

66666666

77777777

88888888

99999999

00000000

12121212

13131313

14141414

15151515

16161616

17171717

18181818

19191919

10101010

21212121

23232323

24242424

25252525

26262626

27272727

28282828

29292929

20202020
le fichier lotery.txt comporte 33 numero
la borne superieure de lotery.txt est 32
le nombre aleatoire est 8 et rand 12235
le numero ganant est: 44444444
Appuyez sur une touche pour continuer...
0