Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lire un .txt et récupérer une ligne précise

Sujet résolu
    11 juin 2021 à 14:55:07

    Bonjour tout le monde ! 

    J'ai fini la partie 1 du TP sur le jeu du pendu. Il faut maintenant que j'ajoute la gestion d'un dictionnaire à mon jeu. J'ai suivi les consignes données dans le cours et j'étais bien parti car j'ai réussi à :

    - lire une première fois le fichier dictionnaire.txt pour y compter le nombre de mots (nombre de "\n")

    - faire un rewind pour revenir au début du fichier dictionnaire.txt

    - tirer un nombre aléatoire compris entre 1 et mon compteurNombreDeMots (= la ligne où se trouvera le mot secret)

    J'y vais étapes par étapes et je vérifie que les différentes actions se font bien grâce à des "printf".

    Là où j'ai plus de mal c'est pour me déplacer dans le fichier.txt jusqu'à la ligne correspondante pour stocker le mot secret dans une chaîne en mémoire. Après avoir tenté pas mal de choses bien foireuses je suis allé voir ce petit bout de code proposé dans la correction :

     while (ligneMotSelectionne > 0)
        {
            caractereLuDansFichierDico = fgetc(fichierDico);
            if (caractereLuDansFichierDico == '\n')
            {
                ligneMotSelectionne--;
            }
        }

    Je dois avouer que je ne comprends pas pourquoi cela est censé fonctionner .. Je vous explique ma compréhension du code (qui doit sûrement être mauvaise !)

    Imaginons cette liste de 3 mots :

    JEU\n
    
    DU\n
    
    PENDU\n

    Si je comprends bien ici on a une boucle qui va décrémenter, à chaque fois que l'on tombe sur un "\n", la variable qui contient le numéro de la ligne qui est choisie aléatoirement comme étant la ligne du mot secret. Si par exemple l'ordi a aléatoirement choisi la ligne 2 :

    - on rentre dans la boucle,

    - on lit "JEU\n",

    - on décremente "ligneMotSelectionne" qui passe à 1,

    - on lit "DU\n",

    - on décremente "ligneMotSelectionne" qui passe à 0,

    - on sort de la boucle

    Je n'ai pas regardé la suite (car je voudrais essayer de finir le code seul) mais j'ai bien envie d'utiliser un fgets après ça. Seulement, selon moi, ici le "curseur" qui se déplace dans le fichier texte n'est pas positionné au niveau du "D" mais plutôt au niveau du "\n" à la fin du mot DU. Du coup, on ne devrait ni pouvoir récupérer le mot en ligne 2, ni le mot en ligne 3...

    Je dois faire une erreur de compréhension quelque part. Peut-être que le curseur se situe au niveau du "P" ? 

    J'aimerais être sur de comprendre parfaitement ce qui se passe ici avant d'aller plus loin.

    Merci d'avance :)

    -
    Edité par LucasLethuillier 11 juin 2021 à 14:56:11

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2021 à 15:45:00

      Je suppose que le numéro de ligne choisi aléatoirement se fait avec rand()%nombre_total ?
      Regardes ce que ça donne si le numéro serait 0, ça devrait aider
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        11 juin 2021 à 16:30:23

        PierrotLeFou a écrit:

        Je suppose que le numéro de ligne choisi aléatoirement se fait avec rand()%nombre_total ?

         Oui c'est ca dans mon jeu j'utilise rand()%x . 

        PierrotLeFou a écrit:

        Regardes ce que ça donne si le numéro serait 0, ça devrait aider

        Merci beaucoup ! Je me suis fait un petit test pour voir si j'avais compris :

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <ctype.h>
        #define TAILLE_MAX 100
        
        int main()
        {
        
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = "";
        int ligne = 0;
        int caractereLuDansFichierDico = 0;
        
        fichier = fopen("brouillon.txt", "r");
        
        if (fichier != NULL)
        {
            printf("Au depart, le curseur est a la position : %ld\n", ftell(fichier));
            printf("Je decide de deplacer le curseur de 2 positions vers l'avant avec un fseek\n");
            fseek(fichier, 2, SEEK_CUR);
            printf("Le curseur se retrouve en position : %ld\n",ftell(fichier));
            printf("Je replace le curseur au debut du fichier avec un rewind\n");
            rewind(fichier);
            printf("Le curseur est a la position : %ld\n", ftell(fichier));
        
            ligne = 1;
        
            while (ligne > 0)
            {
                caractereLuDansFichierDico = fgetc(fichier);
                if (caractereLuDansFichierDico == '\n')
                {
                    ligne--;
                } 
            }
            printf("J'affiche la deuxieme ligne qui est en fait la ligne 1 : %s", fgets(chaine, TAILLE_MAX, fichier));
             
            fclose(fichier);
        }
        
        return 0;
        }

         En fait la première ligne est la ligne 0 ... un peu comme avec les tableaux qui commencent à l'indice 0. C'est fou comme je me laisse perturber par des détails :colere2: (et peut être par VS Code pour le coup)



        -
        Edité par LucasLethuillier 11 juin 2021 à 16:33:34

        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2021 à 17:25:49

          Je pense que tu as compris. :)
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

          Lire un .txt et récupérer une ligne précise

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown