Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème sur la lecture d'un fichier

    25 novembre 2017 à 0:27:01

    Salut!

    Je suis un peu desespéré la j'ai un gros soucis j'arrive pas a acceder a mes données sauvegardées dans un fichier en utilisant une procédure Chargement_sauvegarde, en fait j'ai seulement une partie qui s'affiche correctement, le reste semble me mettre des adresses (a,b,c équivalent à nbjoueur nbordi k(la somme des 2)), si quelqu'un pouvait m'aider, voici la partie du code qui me pose probleme: ca fonctionne de mon coté, c'est juste que je voudrai avoir nbjoueur,nbordi,k, et non pas leur adresse.

    void sauvegarde(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],int NbJoueurs,int NbOrdi,int k)
    {
        int i,j;
        FILE* fic=NULL;
        fic=fopen("sauvegarde.txt","wb+");
        for(i=0;i<20;i++)
        {
            for(j=0;j<20;j++)
            {
                fprintf(fic,"%c",memoire[i][j]);
                fprintf(fic,"%c",MemoireJoueur[i][j]);
            }
        }
        for(i=0;i<4;i++)
        {
            for(j=0;j<21;j++)
            {
                fprintf(fic,"%c",lettre[i][j]);
            }
        }
        fprintf(fic,"%d",NbJoueurs);
        fprintf(fic,"%d",NbOrdi);
        fprintf(fic,"%d",k);
        fclose(fic);
    }
    
    void chargement_sauvegarde(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],int **NbJoueurs,int **NbOrdi,int **k)
    {
        char i,j;
        //************** DEBUT MODIFICATION
        char a,b,c;
        //************** FIN MODIFICATION
        FILE* fic=NULL;
        fic=fopen("sauvegarde.txt","r");
        for(i=0;i<20;i++)
        {
            for(j=0;j<20;j++)
            {
                fscanf(fic,"%c",&memoire[i][j]);
                fscanf(fic,"%c",&MemoireJoueur[i][j]);
            }
        }
        for(i=0;i<4;i++)
        {
            for(j=0;j<21;j++)
            {
                fscanf(fic,"%c",&lettre[i][j]);
            }
        }
        fscanf(fic,"%c",&a);
        fscanf(fic,"%c",&b);
        fscanf(fic,"%c",&c);
    
    
    //************** DEBUT PRINTF
    gotoligcol(25,45);
    printf("%c",a);
    printf(" ");
    printf("%c",b);
    printf(" ");
    printf("%c",c);
    printf(" ");
    //************** FIN PRINTF
    //************** DEBUT MODIFICATION
        NbJoueurs=a-'0';
        NbOrdi=b-'0';
        k=c-'0';
    //************** FIN MODIFICATION
    //************** DEBUT PRINTF
    printf("Premier printf\n");
    printf("%d",NbJoueurs);
    printf(" ");
    printf("%d",NbOrdi);
    printf(" ");
    printf("%d",k);
    printf(" ");
    printf("Fin premier printf\n");
    //************** FIN PRINTF
        fclose(fic);
    }
    
    int preMenu(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],int *NbJoueurs,int *NbOrdi,int *k)
    {
        int touche=0;
        system("cls");
        gotoligcol(1,30);
        printf("Voulez-vous recharger une partie (Enter) ou débuter une partie (Echap)");
        while (touche!=13 && touche !=27)
        {
            touche = getch();
            if (touche==13)
            {
                chargement_sauvegarde(memoire,MemoireJoueur,lettre,&NbJoueurs,&NbOrdi,&k);
    
    //************** DEBUT PRINTF
    printf("2eme printf\n");
    printf("%i",NbJoueurs);
    printf(" ");
    printf("%i",NbOrdi);
    printf(" ");
    printf("%i",k);
    printf(" ");
    printf("Fin 2eme printf\n");
    //************** PRINTF
    
    //************** DEBUT MODIFICATION (pour voir les printf)
                //system("cls");
    //************** FIN MODIFICATION
            }
        }
        return touche;
    }
    
    int main()
    {
    int touche;
    int NbJoueurs;
    int NbOrdi;
    int k;
    //************** DEBUT MODIFICATION (on simule le premenu)
        system("cls");
        gotoligcol(1,30);
        printf("Voulez-vous recharger une partie (Enter) ou débuter une partie (Echap)");
        while (touche!=13 && touche !=27)
        {
            touche = getch();
            if (touche==13)
            {
                chargement_sauvegarde(memoire,MemoireJoueur,lettre,&NbJoueurs,&NbOrdi,&k); // c'est là que ça renvoie n'importe quoi
                //system("cls");
            }
        }
    //************** FIN MODIFICATION (de simulation de premenu)
    
        touche = preMenu(memoire,MemoireJoueur,lettre,&NbJoueurs,&NbOrdi,&k);
    
    
        return 0;
    }
    

    voila ce que mes test affichent.

     Des que j'appelle chargement_sauvegarde dans le prémenu, mes valeurs ne sont plus sauvegardées..

    -
    Edité par QuentinHuard 25 novembre 2017 à 0:32:55

    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2017 à 4:51:27

      Bonjour ! Dans la fonction 'preMenu', NbJoueurs, NbOrdi et k sont des pointeurs, pas des nombres, et je crois que c'est de là que vient l'erreur. Tu as passé par adresse les variables en question, c'est normal, mais tu aurais dû les nommer autrement afin de ne pas oublier que ce sont des pointeurs. Souvent, je mets un 'p' devant les variables passées par adresse afin de ne pas oublier qu'il s'agit de pointeurs.

      À ta place, j'aurais donc défini la fonction :

      int preMenu(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],
                  int *pNbJoueurs,int *pNbOrdi,int *pk)
          // pNbJoueurs : pointeur sur le nombre de joueurs
          // pNbOrdi : pointeur sur le nombre d'ordi
          // pk : pointeur sur k
      

      et pour afficher les valeurs pointées :

      printf("%i",*pNbJoueurs);
      printf("%i",*pNbOrdi);
      printf("%i",*pk);
      
      

      Là c'est clair : * d'un pointeur, c'est la valeur pointée.

      Si tu ne veux pas renommer les variables passées par adresse et ne pas modifier le prototype de la fonction, tu peux faire juste :

      printf("%i",*NbJoueurs);
      printf("%i",*NbOrdi);
      printf("%i",*k);
      

      Ça devrait marcher, mais l'inconvénient, c'est qu'on pourrait croire que NbJoueurs, NbOrdi et k sont des entiers, alors que ce sont des pointeurs d'entier (si on garde le prototype de la fonction telle que tu l'as définie).

      -
      Edité par robun 25 novembre 2017 à 4:53:22

      • Partager sur Facebook
      • Partager sur Twitter
        25 novembre 2017 à 12:08:23

        Salut! j'ai suivis tes instructions et voila ce que j'obtiens:

        alors que ca devrait simplement retourner 2 0 1..

        -
        Edité par QuentinHuard 25 novembre 2017 à 12:09:30

        • Partager sur Facebook
        • Partager sur Twitter
          25 novembre 2017 à 12:33:41

          Tu as fait quoi exactement ?
          • Partager sur Facebook
          • Partager sur Twitter
            25 novembre 2017 à 12:36:43

            j'ai fait ça:

            int preMenu(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],int *pNbJoueurs,int *pNbOrdi,int *pk)
            {
                int touche=0;
                system("cls");
                gotoligcol(1,30);
                printf("Voulez-vous recharger une partie (Enter) ou débuter une partie (Echap)");
                while (touche!=13 && touche !=27)
                {
                    touche = getch();
                    if (touche==13)
                    {
                        chargement_sauvegarde(memoire,MemoireJoueur,lettre,pNbJoueurs,pNbOrdi,pk);
            
            //************** DEBUT PRINTF
            printf("2eme printf\n");
            printf("%i",*pNbJoueurs);
            printf(" ");
            printf("%i",*pNbOrdi);
            printf(" ");
            printf("%i",*pk);
            printf(" ");
            printf("Fin 2eme printf\n");
            //************** PRINTF
            
            //************** DEBUT MODIFICATION (pour voir les printf)
                        //system("cls");
            //************** FIN MODIFICATION
                    }
                }
                return touche;
            }

            et quand j'appelle chargement_sauvegarde, y'a aucun changement si j'appelle les adresses: 

            chargement_sauvegarde(memoire,MemoireJoueur,lettre,&pNbJoueurs,&pNbOrdi,&pk);

            -
            Edité par QuentinHuard 25 novembre 2017 à 12:38:54

            • Partager sur Facebook
            • Partager sur Twitter
              25 novembre 2017 à 12:51:39

              Donc ce n'est pas dans cette fonction qu'il y a un problème. Apparemment, NbJoueurs (et les autres) sont faux avant l'appel de la fonction preMenu. Vérifie ça : affiche la valeur de NbJoueurs à différents endroits du programme, notamment juste avant l'appel à preMenu.

              -
              Edité par robun 25 novembre 2017 à 12:53:50

              • Partager sur Facebook
              • Partager sur Twitter
                25 novembre 2017 à 13:19:42

                je l'ai fais dans le main, avant l'appelle de chargement_sauvegarde

                ca m'affiche n'importe quoi, et apres l'appelle de chargement_sauvegarde et prémenu

                ça m'affiche le MÊME n'importe quoi.

                -
                Edité par QuentinHuard 25 novembre 2017 à 13:20:00

                • Partager sur Facebook
                • Partager sur Twitter
                  25 novembre 2017 à 16:51:29

                  Concentrons-nous sur la variable NbJoueurs. Pourquoi passes-tu l'adresse de cette variable dans la fonction 'preMenu' et, pire, l'adresse de l'adresse de cette variable dans la fonction 'chargement sauvegarde' ? C'est ça qui est bizarre :

                  void chargement_sauvegarde(char memoire[20][20],char MemoireJoueur[20][20],
                                     char lettre[4][21],int **NbJoueurs,int **NbOrdi,int **k)
                  


                  Qu'est-ce que c'est que ces ** ???? Je pense qu'il faut une seule * puisque tu appelles cette fonction ainsi :

                  chargement_sauvegarde(memoire,MemoireJoueur,lettre,&NbJoueurs,&NbOrdi,&k);
                  // c'est là que ça renvoie n'importe quoi

                  (que ce soit à la ligne 193 ou à la ligne 129).

                  En fait, j'ai l'impression que là où tu as mis des *, il ne fallait pas en mettre, et là où tu as mis des **, il en fallait juste une. Tu devrais regarder de plus près les arguments des fonctions...

                  -
                  Edité par robun 25 novembre 2017 à 16:54:36

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 novembre 2017 à 14:44:37

                    je suis débutant à l'informatique je veux apprendre , est-ce que vous me conseillez?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 novembre 2017 à 15:34:39

                      QuentinHuard a écrit:


                      void sauvegarde(char memoire[20][20],char MemoireJoueur[20][20],char lettre[4][21],int NbJoueurs,int NbOrdi,int k)
                      {
                          ...
                          fprintf(fic,"%d",NbJoueurs);
                          fprintf(fic,"%d",NbOrdi);
                          fprintf(fic,"%d",k);
                          fclose(fic);
                      }
                      
                      

                      Bonjour,

                      Si tu ne mets pas d'espaces entre tes nombres, au chargement il ne saura pas les différencier....

                      ->

                          fprintf(fic,"%d ",NbJoueurs);
                          fprintf(fic,"%d ",NbOrdi);
                          fprintf(fic,"%d",k);
                      



                      • Partager sur Facebook
                      • Partager sur Twitter
                      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **

                      Problème sur la lecture d'un fichier

                      × 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