Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ecriture dans un fichier

Un niveau par ligne

Sujet résolu
    19 juillet 2006 à 10:25:23

    Bonjour,

    Autant vous le dire tout de suite : je patauge lamentablement dans la lecture/écriture des fichiers.
    Ainsi, je ne parviens pas du tout à coder le script de sauvegarde de niveau pour l'éditeur de mon Snake.
    Déjà le mode d'ouverture : lorsque j'utilise le mode r+, tantôt cela fonctionne, tantôt non ; le mode w donne un résultat totalement erroné...
    Ensuite le déplacement du curseur : fgets ne fonctionne pas quand fseek fonctionne de temps en temps...

    Le code sera plus parlant :
    int sauvegarderNiveau(int carte[][NOMBRE_BLOCS_HAUTEUR], const unsigned short int indice)
    {

            int     i = 0,
                            j = 0;

    /****************************
     *   Ouverture du fichier   *
     ****************************/


        FILE* fichier = fopen("Niveaux.lvl", "w");
        if (fichier == NULL)
        {
                    return 0;
        }

    /****************************
     *   Ecriture de la carte   *
     ****************************/


            fseek(fichier, (NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2) * (indice - 1), SEEK_SET);

            while (i < NOMBRE_BLOCS_HAUTEUR)
            {
                    while (j < NOMBRE_BLOCS_LARGEUR)
                    {
                            fprintf(fichier, "%d", carte[i][j]);

                            j++;
                    }

                    j = 0;
                    i++;
            }

    /****************************
     *   Fermeture du fichier   *
     ****************************/


        fclose(fichier);
        return 1;
    }

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2006 à 11:02:23

      Citation : Chahine

      fseek(fichier, (NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2) * (indice - 1), SEEK_SET);



      o_O

      Tu n'as pas le droit de faire un fseek sur une position que tu calcules comme ca, il faudrait utiliser le binaire.
      Pour faire un fseek, il faut utiliser une position que tu as lue auparavant!
      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2006 à 12:19:51

        Non, moi pour le mario sokoban, j'ai fais pareil avec le fseek et ça marche parfaitement bien !
        Par contre dans tonfseek, tu as "2 + ...". Il faut juste rajouter 1 caractère afin qu'il lise le \n de fin de ligne !


        void sauvNiveau(int niveau[BLOC_HORIZON][BLOC_VERT], long level)
        {
            FILE *fic;
            int i = 0, j = 0;

            fic = fopen("niveau.lvl", "r+");
            if (fic == NULL)
            {
                fic = fopen("niveau.lvl", "w");
                for(i=0 ; i<BLOC_HORIZON ; i++)
                    for(j=0 ; j<BLOC_VERT ; j++)
                        fprintf(fic, "0");
                fclose(fic);
            }
            else
            {
                fseek(fic, (1 + BLOC_VERT * BLOC_HORIZON) * (level-1), SEEK_SET);
                for(i=0;i<BLOC_HORIZON;i++)
                    for(j=0;j<BLOC_VERT;j++)
                        fprintf(fic, "%d", niveau[i][j]);
                if(feof(fic))
                    fprintf(fic, "\n");
            fclose(fic);
            }
        }


        Voiàl j'espère que je t'ai aidé
        • Partager sur Facebook
        • Partager sur Twitter
          19 juillet 2006 à 13:19:49

          Citation : Arkhiall

          Tu n'as pas le droit de faire un fseek sur une position que tu calcules comme ca


          Oui, M@teo l'avait dit : ne pas trop faire confiance à fseek()...
          Seulement je n'ai pas trouvé d'autre moyen de déplacer précisemment le curseur, alors comment faire ?

          Citation : Tqup3

          Non, moi pour le mario sokoban, j'ai fais pareil avec le fseek et ça marche parfaitement bien !
          Par contre dans tonfseek, tu as "2 + ...". Il faut juste rajouter 1 caractère afin qu'il lise le \n de fin de ligne !


          Mon Mario Sokoban fonctionne également avec fseek().
          Sinon j'ai rajouté 2, et non 1, car il faut compter les '\0' et '\n' (c'était le sujet d'un de mes problèmes à l'époque où je codais mon Mario Sokoban)...

          Néanmoins, merci pour ton code, je suis en train de m'en inspirer pour quelques rectifications.
          • Partager sur Facebook
          • Partager sur Twitter
            19 juillet 2006 à 13:46:44

            Lol chahine, t'est toujours sur ton snake ?


            FILE* fichier = NULL;
                int i = 0, j = 0;
                fichier = fopen("level.lvl", "a");
                if (fichier == NULL)
                    return 0;
                   
                fseek(fichier, 0, SEEK_END);
               
                while (i < NOMBRE_BLOCS_HAUTEUR)
                {
                    while (j < NOMBRE_BLOCS_LARGEUR)
                    {
                        fprintf(fichier, "%ld", carte[i][j]);
                        j++
                    }
                    j = 0;
                    i++;
                }
                fputs( "\n", fichier);
                fclose(fichier);
                return 1;





            pour rajouter un niveau en fin de ligne

            pour rajouter a la ligne correspondant a indice :

            tu sauvegarde tout le fichier dans un tableau[ligne][niveaux]
            tu réecris tout le tableau[indice - 1][niveaux]

            ( avec des boucles )

            puis tu inséres ton niveau :

            while (i < NOMBRE_BLOCS_HAUTEUR)
            {
            while (j < NOMBRE_BLOCS_LARGEUR)
            {
            fprintf(fichier, "%ld", carte[i][j]);
            j++
            }
            j = 0;
            i++;
            }

            puis tu insére le reste du tableau[indice+1][niveaux]
            • Partager sur Facebook
            • Partager sur Twitter
              19 juillet 2006 à 14:09:10

              Citation : T4g1

              Lol chahine, t'est toujours sur ton snake ?


              Lol T4g1, toujours en train de contourner mes problèmes au lieu de les surmonter ?! :lol:

              Je ne souhaite pas seulement pouvoir ajouter des niveaux, mais aussi les modifier.
              • Partager sur Facebook
              • Partager sur Twitter
                19 juillet 2006 à 14:13:44

                oui j'ai modifié le post , tu ouvre le fichier et tu le sauvegarde dans un tableau a double entrées ( tu le lis et a chaque /n tu changes de ligne tableau[lignes][contenu de la ligne], puis tu efface le fichier t tu le recree en ecrivant tableau[niveaux_créé - 1][contenu]
                puis tu ecris ton niveau carte[niveau][]
                puis tu reecris la fin du fichier
                tableau[niveaux_créé + 1][contenu]

                normalement ca devraitfonctionner
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juillet 2006 à 17:51:36

                  J'ai tenté ceci :
                  else // le fichier a été auparavant ouvert en mode "r"
                      {

                  /************************
                   *   Copie du fichier   *
                   ************************/


                          char contenu[NOMBRE_NIVEAUX][NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2];

                          while (i < NOMBRE_NIVEAUX)
                                  {
                                          fgets(contenu[i], NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2, fichier);
                                          i++;
                                  }

                                  fclose(fichier);

                  /*************************************************
                   *   Réécriture du fichier avant la sauvegarde   *
                   *************************************************/


                                  fichier = fopen("Niveaux.lvl", "w+");

                                  i = j = 0;
                                  while (i < indice)
                                  {
                                          while (j < NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2)
                                          {
                                                  fprintf(fichier, "%c", contenu[i][j]);
                                                  j++;
                                          }

                                          j = 0;
                                          i++;
                                  }


                  /*********************************
                   *   Ecriture de la sauvegarde   *
                   *********************************/


                                  i = j = 0;
                                  while (i < NOMBRE_BLOCS_LARGEUR)
                                  {
                                          while (j < NOMBRE_BLOCS_HAUTEUR)
                                          {
                                                  fprintf(fichier, "%d", carte[i][j]);

                                                  j++;
                                          }

                                          j = 0;
                                          i++;
                                  }

                                  fprintf(fichier, "\O");
                                  fprintf(fichier, "\n");

                  /*************************************************
                   *   Réécriture du fichier après la sauvegarde   *
                   *************************************************/


                                  i = indice + 1;
                                  j = 0;
                                  while (i < NOMBRE_NIVEAUX)
                                  {
                                          while (j < NOMBRE_BLOCS_LARGEUR * NOMBRE_BLOCS_HAUTEUR + 2)
                                          {
                                                  fprintf(fichier, "%d", contenu[i][j]);
                                                  j++;
                                          }

                                          j = 0;
                                          i++;
                                  }
                      }

                  Ce code fout véritablement le bordel dans mon fichier Niveaux.lvl...

                  Je n'apprécie pas vraiment de devoir manipuler tout le contenu du fichier uniquement pour la modification d'une ligne... Dans un Snake à 20 niveaux, c'est déjà laborieux, mais comment font donc les programmeurs de "vrais" jeux ?
                  Il doit tout de même bien exister un moyen de se déplacer avec précision dans un fichier...

                  EDIT >> Bon j'ai trouvé d'où venait le problème en affichant tous les caractères dans Notepad++, voici ce que j'avais :
                  Image utilisateur
                  Voici ce qu'il fallait que j'aie :
                  Image utilisateur

                  A présent cela fonctionne par-fai-tem-ment avec un fseek()... Je vous retrouve dans un prochain sujet pour débattre de cette fameuse fonction que l'on accuse de n'être pas fiable en mode non binaire...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Ecriture dans 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