Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer un ligne d'un fichier texte

Sujet résolu
    30 juin 2020 à 9:53:16

    Bonjour,

    Et il c'est encore moi (pour ceux qui m'ont déjà croisé dans d'autres posts) !

    Bon expliquons clairement le problème :

    après le post précédent, (https://openclassrooms.com/forum/sujet/extraire-un-bloc-dun-fichier-texte)

    J'ai donc réussi à récupérer mon bloc d'infos comme je le voulais, simplement en recherchant mon "mot clé" :

    char *res2 = binstr(read_line,sizeof(read_line),"DATA BLK, LEVEL");
                fprintf(outfile, "%s", res2);
                if (res2)
                {
                    while(fgets(read_line,sizeof(read_line),infile)){
                        fprintf(outfile, "%s\n", res2);
                        if(read_line[1] == ' '){
                            break;        
                        }
                    } 
                }

    ce qui me donne en résultat (Extrait) :

    00000002720A280     E3D3F0F7     F5F5C161     F2F6D4C1     E8000000  TL0755A.26MAY...                                              
    
    00000002720A290     00000000     00000000     00000017     00000000  ................                                              
    
    00000002720A2A0     00000F00     C6D9D7C1     D940D5D6     D7C8D6D5  ....FRPAR NOPHON                                              
    
    ½SYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                             TAPE G01738         DUMP 3589  PAGE 00000165 
    
    YSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                             TAPE G01738         DUMP 3589  PAGE 00000166  
    
    00000002720A2B0     C5000000     00000000     00000000     00000000  E...............                                              
    
    00000002720A2C0     00000000     00000000     0000C008     7D2DBD32  ................                                              
    
    00000002720A2D0     008F0000     00000000     00000000     00000000  ................                                              
    
    00000002720A2E0     00203800     24C5E3C8     4DB1C200     00000000  .....ETH..B.....                                              
    
    



    Voici ma question :

    Comment supprimer les lignes

    ½SYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR

    Merci,

    Bonne journée

    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2020 à 10:04:18

      Bonjour,

      Il suffit de ne pas les écrire dans le fichier.

      • Partager sur Facebook
      • Partager sur Twitter
        30 juin 2020 à 10:10:31

        Je peux faire ça en testant read_line ?
        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2020 à 10:18:09

          Oui. Il semblerait que les lignes que tu souhaites conserver commencent par un ou plusieurs zéros ...
          • Partager sur Facebook
          • Partager sur Twitter
            30 juin 2020 à 10:22:55

            La ligne que tu veux supprimer, c'est une ligne du fichier de sortie, pas du fichier d'entrée, c'est bien ça ? Eh bien il faut faire comme a dit magma (ne surtout pas attendre que le fichier soit complet avant de se demander s'il n'y a pas des lignes en trop, ce serait trop compliqué).

            Pour ne pas écrire une ligne particulière, il faut connaître à quelle condition la ligne peut figurer dans le fichier de sortie et programmer cette condition.

            Mettons que l'instruction qui écrit une ligne dans le fichier de sortie soit :

            fprintf(outfile, "%s\n", res2);  // il me semble que c'est cette ligne là

            Eh bien il faut la remplacer par :

            if (est_valide(res2))
                fprintf(outfile, "%s\n", res2);

            où 'est_valide' est une fonction qui retourne un booléen, vrai lorsque la ligne vérifie la condition lui permettant de figurer dans le fichier de sortie, sinon faux. Ce qui compte, c'est de pouvoir exprimer précisément cette condition et de la programmer dans la fonction.

            -
            Edité par robun 30 juin 2020 à 10:26:23

            • Partager sur Facebook
            • Partager sur Twitter
              30 juin 2020 à 10:41:04

              Oui c'est une ligne du fichier de sortie.

              J'ai fais ça, dans ma tête ça devrait marcher mais non ...

              char *res2 = binstr(read_line,sizeof(read_line),"*DATA BLK, LEVEL");
                          fprintf(outfile, "%s", res2);
                          if (res2)
                          {
                              while(fgets(read_line,sizeof(read_line),infile)){
                                  if (read_line[1] == '0')
                                  {
                                      fprintf(outfile, "%s\n", res2);
                                      if(read_line[1] == ' '){
                                          break;        
                                      }
                                  }
                              } 
                          }


              Enfin, ça marche mais ma condition d'arrêt ne marche plus ... J'ai l'impression qu'il ne rentre pas dans le 2eme if.

              Faire une fonction pour ça me parait compliqué.

              J'ai quand même essayer de faire une fonction mais je ne sais pas trop quoi mettre dedans :

              bool is_valid(char *chaine){
                  if (read_line[1] == '0')
                  {
              
                  }
                  return true;
              }



              -
              Edité par ElouanBesnard 30 juin 2020 à 11:24:21

              • Partager sur Facebook
              • Partager sur Twitter
                30 juin 2020 à 11:38:10

                char *res2 = binstr(read_line,sizeof(read_line),"DATA BLK, LEVEL");
                fprintf(outfile, "%s", res2);
                if (res2)
                {
                    while(fgets(read_line,sizeof(read_line),infile))
                    {
                        if(read_line[1] == '0') {
                            fprintf(outfile, "%s\n", res2);
                        }
                        if(read_line[1] == ' ') {
                            break;       
                        }
                    }
                }
                • Partager sur Facebook
                • Partager sur Twitter
                  30 juin 2020 à 11:57:36

                  ElouanBesnard a écrit:

                  Faire une fonction pour ça me parait compliqué.

                  Ça dépend de la condition, je ne la connais pas (magma a essayé de la deviner, est-ce qu'il a trouvé ?). C'est sûr que s'il faut juste vérifier que la ligne commence par '0' ce n'est peut-être pas indispensable.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 juin 2020 à 13:43:41

                    Merci magma ! une erreur bête ! :D

                    robun a écrit:

                    Ça dépend de la condition, je ne la connais pas (magma a essayé de la deviner, est-ce qu'il a trouvé ?). C'est sûr que s'il faut juste vérifier que la ligne commence par '0' ce n'est peut-être pas indispensable.



                    Oui c'est bon j'ai tout ce qu'il me faut je ne reviendrais plus xD

                    Merci de toute votre aide !

                    EDIT :

                    Enfaite une dernière question :D

                    Mon chemin vers le dump est ./Dumps/dumpX.txt

                    J'utilise argv pour demander le chemin quand on exécute le programme, comment je fais pour avoir à taper seulement dumpX.txt et pas ./Dumps/dumpX.txt lors de l'exe ?

                    J'ai essayer de créé une variable      char * path = "./Dumps/argv[1]";

                    je ne sais pas comment mettre argv + autre chose

                    Au revoir

                    -
                    Edité par ElouanBesnard 30 juin 2020 à 14:19:36

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 juin 2020 à 14:39:16

                      ElouanBesnard a écrit:

                      Mon chemin vers le dump est ./Dumps/dumpX.txt

                      J'utilise argv pour demander le chemin quand on exécute le programme, comment je fais pour avoir à taper seulement dumpX.txt et pas ./Dumps/dumpX.txt lors de l'exe ?

                      J'ai essayer de créé une variable      char * path = "./Dumps/argv[1]";

                      je ne sais pas comment mettre argv + autre chose

                      ___

                      Tu peux utiliser la fonction sprintf() ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 juin 2020 à 14:57:26

                        sprintf c'est pour afficher une chaine formatée non ?

                        Je pensais utiliser strcat(). J'ai fais ça mais ca ne marche pas :

                        char * path = "./Dumps/";
                            strcat(path,argv[1]);
                            FILE* infile = fopen(path, "rb");


                        EDIT :

                        En définissant path comme ça, ca marche :

                        char path[80] = "./Dumps/";
                            strcat(path,argv[1]);
                            FILE* infile = fopen(path, "rb");

                        -
                        Edité par ElouanBesnard 30 juin 2020 à 15:02:44

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 juin 2020 à 15:54:34

                          ElouanBesnard a écrit:

                          sprintf c'est pour afficher une chaine formatée non ?

                          Non, c'est pour écrire une chaîne formatée dans une variable.

                          Exemple :

                              sprintf(filename, "%s%s", path, argv[1]);
                              FILE* infile = fopen(filename, "rb");

                          C'est pratique quand le nom à former est plus compliqué. Par exemple si on veut numéroter des fichiers avec des numéros à deux chiffres, on fait une boucle sur les numéros et on utilise le format "%s%s%02d". Ou bien si, pour plus de souplesse, tu indiques le répertoire comme argument de la ligne de commande (juste "Dumps"), on obtiendrait le nom complet ainsi :

                              sprintf(filename, "./%s/%s", argv[1], argv[2]);

                          C'est plus simple que faire trois 'strcat' à la suite. (PS : c'est vraiment utile d'ajouter ./ ?)

                          Sinon, pour la première façon qui ne marchait pas, c'est parce que tu as voulu modifier la chaîne pointée par 'path', qui est une chaîne constante : c'est interdit. Dans la deuxième façon, 'path' a été déclarée comme une chaîne « normale », c'est OK.

                          -
                          Edité par robun 30 juin 2020 à 16:01:29

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 juin 2020 à 16:17:36

                            Ah ok j'ai compris !

                            Ici le strcat me convient.

                            Et oui le "./" n'est pas utile bien vu !

                            Merci

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Supprimer un ligne d'un fichier texte

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            • Editeur
                            • Markdown