Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer une ligne dans un fichier

Mon code ne marche pas :)

    30 décembre 2007 à 20:22:18

    Bonjour,

    M'étant renseigné sur ce sujet, j'ai vu que pour supprimer une ligne dans un fichier, il falait recopier toutes les lignes dans un autre fichier, sauf celle qu'on veut supprimer.

    J'ai donc testé ce code, le problème comme vous vous en douté peut être, c'est qu'il ne fonctionne pas.

    Je vous donne la parti de mon code qui génère la suppression d'une ligne :

    1. int saveEdition (int carte[][NB_BLOCS], int ligneFichier, int niveauCharge, int suppr)
    2. {
    3.         char ligne[NB_BLOCS * NB_BLOCS + 1];
    4.     FILE *fichier = NULL, *fichier2 = NULL;
    5.         int i, j;
    6.         if(niveauCharge == 0)
    7.         {
    8.                 fichier = fopen("niveauxEdition.lvl", "a");
    9.                 if (fichier == NULL)
    10.                         return 0;
    11.                         for(i = 0; i < NB_BLOCS; i++)
    12.                         {
    13.                                         for(j = 0; j < NB_BLOCS; j++)
    14.                                         {
    15.                                                 fprintf(fichier,"%d", carte[i][j]); /* On test chaque cases de
    16.                                                 la carte et on écris les constantes dans niveauxEdition.lvl .*/
    17.                                         }
    18.                         }
    19.                         fprintf(fichier, "\n");
    20.                 fclose(fichier);
    21.         }
    22.         else if(niveauCharge == 1) // Si on veut éditer un niveau.
    23.         {
    24.                 fichier = fopen("niveauxEdition.lvl", "r+"); /* On passe en mode lecture et écriture
    25.                  avec r+ car si on utilisait w, le contenue serait supprimé. On remplace donc la ligne
    26.                  lu par une nouvelle ligne (edition de la carte). */
    27.                 fichier2 = fopen("niveauxEdition.tmp", "w");
    28.                 if(fichier == NULL)
    29.                         return 0;
    30.                 if(fichier2 == NULL)
    31.                         return 0;
    32.     rewind(fichier);
    33.                 for(i = 0; i < ligneFichier; i ++)
    34.                 fseek(fichier,  ((NB_BLOCS * NB_BLOCS) +2), SEEK_CUR);
    35. //###### Suppression des lignes où il n'y a pas le curseur.######
    36.                 if(suppr == 1)
    37.                 {
    38.                         while(fgets(ligne, sizeof ligne, fichier))
    39.                         {
    40.                                 if(ligne[NB_BLOCS * NB_BLOCS + 1] != ftell(fichier));
    41.                                 fputs(ligne, fichier2);
    42.                         }
    43.                 rename("niveauxEdition.tmp", "niveauxEdition.lvl");
    44.                 }
    45. //##############################################
    46.                         for(i = 0; i < NB_BLOCS; i++)
    47.                         {
    48.                                         for(j = 0; j < NB_BLOCS; j++)
    49.                                         {
    50.                                                 fprintf(fichier,"%d", carte[i][j]); /* On test chaque cases de
    51.                                                 la carte et on écris les constantes dans niveauxEdition.lvl .*/
    52.                                         }
    53.                         }
    54.         fclose(fichier);
    55.         fclose(fichier2);
    56.         }
    57.         return 1;
    58. }


    et biensur, ceci est dans une autre fonction...

    1. case SDLK_DELETE:
    2.   suppr = 1;
    • Partager sur Facebook
    • Partager sur Twitter
      30 décembre 2007 à 20:41:12

      j'ai pas trop lu ton code, mais je te donne comment je ferais (le pseudo-algo):

      1. void supprimer_ligne(int ligne)
      2. {
      3.         int i = 0;
      4.         /* nb_ligne = nombre de ligne dans le fichier
      5.              max_largeur = nombre de caractere maximum sur une ligne
      6.         */
      7.         int nb_ligne = compter_nb_ligne();
      8.         int max_largeur = compter_max_largeur();
      9.         /* allocation d'un tableau 2D (nb_ligne * max_largeur)
      10.           ...
      11.         */
      12.         /* tu ouvres ton fichier
      13.            ...
      14.          */
      15.         /* tu mets les lignes du fichier dans le tableau
      16.            ...
      17.          */
      18.         /* et tu ecris les lignes dans le fichier (autre fichier) */
      19.         for(; i < nb_ligne; ++i)
      20.         {
      21.                 if(i == ligne)
      22.                         continue;
      23.                 fprintf(fichier, "%s", tableau[i]);
      24.         }
      25. }
      • Partager sur Facebook
      • Partager sur Twitter
        31 décembre 2007 à 11:40:46

        Je vais garder ma solution car je l'ai trouvé sur un tuto qui expliquait comment faire ^^ merci quand même.

        Sinon, une idée ? :)
        • Partager sur Facebook
        • Partager sur Twitter
          31 décembre 2007 à 12:05:05

          Bonjour,
          Code d'exemple dans la FAQ C de developpez.net assez simple à comprendre.
          • Partager sur Facebook
          • Partager sur Twitter
            31 décembre 2007 à 12:34:59

            Oui, j'ai pris exemple sur ce code ^^ . J'ai essayé d'adapté car je voulais
            que ca supprime la ligne qu'on est en train de lire mais cela ne marche pas.
            • Partager sur Facebook
            • Partager sur Twitter
              31 décembre 2007 à 13:54:40

              Si tu ne donne pas tes modifications, ni un code ni même une information que veux-tu qu'on face pour toi?
              Qu'on code à ta place?
              • Partager sur Facebook
              • Partager sur Twitter
                31 décembre 2007 à 14:23:11

                Il suffit de regarder mon premier poste pour voir ce que j'ai essayé de faire ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  1 janvier 2008 à 21:43:52

                  UP :)

                  Bonne année à tous et à toutes ! ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 janvier 2008 à 13:55:25

                    Citation : The Whiplash

                    UP :)


                    Le principe pour supprimer une ligne dans un fichier est de recopier le fichier ligne a ligne dans un autre fichier en omettant de copier la ligne à supprimer. Ensuite, on fait le ménage avec rename() et remove().

                    Pour ça, il faut avoir un critère clair qui identifie la ligne.

                    1. fa := ouvrir(A, LECTURE)
                    2. fb := ouvrir(B, ECRITURE)
                    3. TANT QUE NON FIN(fa)
                    4.  lire_ligne (fa, ligne)
                    5.  SI critere_non_atteint (ligne)
                    6.   ecrire_ligne (fb, ligne)
                    7.  FIN SI
                    8. FIN TANT QUE
                    9. fermer (fb)
                    10. fermer (fa)
                    11. renommer (B, A)
                    12. effacer (B)

                    Nota, par un jeu plus subtil de renommage, on peut conserver la version n-1 du fichier (.bak), ce qui permet d'annuler la suppression (au moins une fois...)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      2 janvier 2008 à 15:12:31

                      J'ai un peu près compris la syntaxe du code mais le problème c'est que je ne vois pas comment identifier la ligne où est le curseur.

                      j'ai essayé avec ftell mais sans succès.

                      Merci pour ton aide ;) .

                      ps : Merci également pour ton site très complet qui m'est parfois très utile ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 janvier 2008 à 18:06:27

                        Citation : The Whiplash

                        J'ai un peu près compris la syntaxe du code mais le problème c'est que je ne vois pas comment identifier la ligne où est le curseur.


                        C'est quoi le curseur ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          2 janvier 2008 à 18:35:13

                          Hum, désolé je me suis mal exprimé.
                          Le curseur "virtuelle" désigne la position où on est.

                          J'ai tenté de faire ce code :

                          1. fichier = fopen("niveauxEdition.lvl", "r+"); /* On passe en mode lecture et écriture
                          2.                  avec r+ car si on utilisait w, le contenue serait supprimé. On remplace donc la ligne
                          3.                  lu par une nouvelle ligne (edition de la carte). */
                          4.                 fichier2 = fopen("niveauxEdition.tmp", "w");
                          5.                 if(fichier == NULL)
                          6.                         return 0;
                          7.                 if(fichier2 == NULL)
                          8.                         return 0;
                          9.                 for(i = 0; i < ligneFichier; i++)
                          10.                 fseek(fichier,  ((NB_BLOCS * NB_BLOCS) +2), SEEK_CUR);
                          11.                 if(suppr == 1)
                          12.                 {
                          13.                         fprintf(fichier, "A");
                          14.                          while(fgets(ligne, sizeof ligne, fichier))
                          15.                          {
                          16.                                  if(ligne[0] != 'A' )
                          17.                                  {
                          18.                                    fputs(ligne, fichier2);
                          19.                                  }
                          20.                          }
                          21.                 }
                          22.                 else
                          23.                 {
                          24.                         for(i = 0; i < NB_BLOCS; i++)
                          25.                         {
                          26.                                         for(j = 0; j < NB_BLOCS; j++)
                          27.                                         {
                          28.                                                 fprintf(fichier,"%d", carte[i][j]); /* On test chaque cases de
                          29.                                                 la carte et on écris les constantes dans niveauxEdition.lvl .*/
                          30.                                         }
                          31.                         }
                          32.                 }
                          33.         fclose(fichier);
                          34.         fclose(fichier2);
                          35.     rename("niveauxEdition.tmp", "niveauxEdition.lvl");
                          36.         remove("niveauxEdition.tmp");


                          Le principe étant d'écrire le caractère A en premier caractère sur la ligne à laquel on se trouve puis de récrire toutes les autres lignes dans l'autre fichier.

                          Cela marche mais j'ai une suite de caractères insinifiants. Ceux-ci sont placés en début de fichier. Je ne peux pas fournir d'exemple car ces caractères ne sont pas affichés par le zCode

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 janvier 2008 à 18:56:50

                            Citation : The Whiplash

                            Hum, désolé je me suis mal exprimé.
                            Le curseur "virtuelle" désigne la position où on est.


                            On ? Qui ça 'on' ?

                            Citation : Pas de titre

                            J'ai tenté de faire ce code :


                            Ca a toutes les chances de ne pas fonctionner et de détruire le fichier d'origine... J'ai donné (et je ne suis pas le seul) une solution sure et éprouvée. Qu'attends-tu pour la mettre en œuvre ?

                            Les "*+", c'est en général le moyen le plus sur... de détruire son fichier... Je ne sais pas pourquoi M@teo en parle, c'est d'un usage très avancé pas du tout à la portée des débutants (et dont les professionnels se méfient).
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              2 janvier 2008 à 19:29:24

                              J'ai tenté de faire exactement de la même façon que tu m'as recommandé mais je ne vois pas quel critère je peux mettre afin que ca ne supprime que la ligne qui est en train d'être lu.
                              C'est pour cela que j'ai essayé de faire en sorte qu'un caractère soit marqué en début de ligne pour ensuite la supprimer plus facilement mais vu que tu dis que cela est asser "dangereux" et pas à ma porté, je vais abandonner cette idée.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                2 janvier 2008 à 20:30:05

                                Citation : The Whiplash

                                J'ai tenté de faire exactement de la même façon que tu m'as recommandé mais je ne vois pas quel critère je peux mettre afin que ca ne supprime que la ligne qui est en train d'être lu.
                                C'est pour cela que j'ai essayé de faire en sorte qu'un caractère soit marqué en début de ligne pour ensuite la supprimer plus facilement mais vu que tu dis que cela est asser "dangereux" et pas à ma porté, je vais abandonner cette idée.


                                C'est quand même toi qui sait quelle ligne tu veux supprimer alors c'est à toi de définir ce que tu veux faire.

                                "La ligne qui contient ceci", "la ligne numéro tant" etc. Exprime toi... c'est ton projet...

                                Je crois que ton vrai problème, c'est que tu ne sais pas ce que tu veux faire...

                                Y'a pas de secret, la première étape, c'est la définition du problème. C'est comme ça dans toutes les disciplines techniques, je ne vois pas pourquoi ce serait différent en informatique...


                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  2 janvier 2008 à 20:47:52

                                  En fait, je savais ce que je voulais faire mais j'ai dù mal me faire comprendre.

                                  J'ai d'ailleur trouvé la solution à mon problème sauf que la ligne supprimé est la précédente mais je vais me débrouiller pour régler cela ^^ .

                                  Encore merci pour ton aide.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    2 janvier 2008 à 21:01:41

                                    Citation : The Whiplash

                                    En fait, je savais ce que je voulais faire mais j'ai dù mal me faire comprendre.


                                    Travaille ça, car c'est fondamental, quelle que soit ton activité.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !

                                    Supprimer une ligne 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