Tri qleatoire dans un fichier txt progamme c

poulo77 Messages postés 8 Statut Membre -  
poulo77 Messages postés 8 Statut Membre -
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
Configuration: Windows XP
Firefox 3.5.6

4 réponses

  1. loupius Messages postés 789 Statut Membre 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
  2. poulo77 Messages postés 8 Statut Membre
     
    comment la fonction ftell? montre moi un example.puis-je utiliser fseek
    0
    1. loupius Messages postés 789 Statut Membre 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
  3. poulo77 Messages postés 8 Statut Membre
     
    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
    1. loupius Messages postés 789 Statut Membre 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
  4. poulo77 Messages postés 8 Statut Membre
     
    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