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 -
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
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:
- Tri qleatoire dans un fichier txt progamme c
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
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.
- 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.
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
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
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.
- 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.
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...
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...