[C]Parsing d'un fichier

Résolu
Bonjour,

j'aurais besoin d'aide pour parser un fichier contenant les résultats d'un traceroute avec l'option -n.
Par exemple, je lance ce traceroute :

~ traceroute -n 192.48.96.9

traceroute to 192.48.96.9 (192.48.96.9), 30 hops max, 40 byte packets
 1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
 2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
 3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
 4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
 5  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
 6  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
 7  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
 8  195.10.40.34  599.152 ms  599.289 ms  631.011 ms
 9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms



Je voudrais savoir comment faire pour récupérer toutes les adresses IP et également comment faire pour ne pas prendre en compte les adresses IP non autorisées pour mon problème.

Les plages d'adresse IP non autorisées sont les suivantes :
10.0.0.0 à 10.255.255.255
172.16.0.0 à 172.31.255.255
192.168.0.0 à 192.168.255.255
224.0.0.0 à 239.255.255.255
240.0.0.0 à 255.255.255.255

Merci par avance

8 réponses

  1. Est-ce que quelqu'un pourrait m'aider, s'il vous plait?

    Merci
    0
    1. Modérateur
      Le mieux c'est de regarder ces deux fonctions : sous linux ou dans google tape :
      man fscanf
      man strtok

      L'idée est de prendre comme séparateur "ms" pour aller de temps en temps si tu utilises strtok. Mais je pense que ptu peux t'en sortir avec juste un fscanf.

      Attention au cas ou les temps n'apparaissent pas (contrôler le retour de fscanf), par exemple si l'hote est injoignable.

      Bonne chance
      0
      1. Bonjour,

        alors pour le parsing, j'ai fait ceci.
        A la sortie de la fonction, j'obtiens les mêmes lignes que le traceroute or, j'ai bien utilisé le fscanf pour ne prendre en compte que les adresses IP

        Est-ce que quelqu'un pourrait me dire d'ou vient le problème ?

        Merci

        #include <stdio.h>
        #include <stdlib.h>
        
        
        
        int main(void){
          FILE * file = fopen("fichier","r");
          char buffer[BUFSIZ];
          char buf1[BUFSIZ];
          char buf2[BUFSIZ];
          char buf3[BUFSIZ];
          char buf4[BUFSIZ];
        
          if(file == NULL){
            perror("erreur de lecture");
            exit(-1);
          }
          
          while(fgets(buffer, sizeof buffer, file) != NULL){
            fscanf(file, "%s.%s.%s.%s", buf1, buf2, buf3, buf4);
            printf("%s\n",buffer);
          }
          
          return 0;
        }
        
        0
        1. Bonjour,

          j'ai modifié mon code et j'obtiens un résultat plus convenable mais ce n'est pas encore très bien.

          Bonjour,

          j'ai fait le parsing de cette manière, ne connaissant pas regexp.

          Mon fichier pour le teste est le suivant :
           1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
           2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
           3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
           4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
           5  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
           6  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
           7  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
           8  195.10.40.34  599.152 ms  599.289 ms  631.011 ms
           9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
          10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
          11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
          12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
          13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms


          et en sortie, j'obtiens ceci :
          1
            195.6.244.14
            194.206.126.244
            194.206.126.2
            208.213.229.130
            208.213.229.129
            208.213.229.226
            195.10.40.34
            157.130.34.217
            146.188.160.62
            146.188.160.181
            137.39.253.86
            192.48.96.9


          Il y a un problème au niveau de la première ligne, pourquoi ?

          Voici mon code :
          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>
          
          
          
          int main(void){
            FILE * file = fopen("fichier","r");
            char buffer[BUFSIZ];
            char buf1[BUFSIZ];
            char buf2[BUFSIZ];
            char buf3[BUFSIZ];
            char buf4[BUFSIZ];
            char * espace;
          
            if(file == NULL){
              perror("erreur de lecture");
              exit(-1);
            }
            
            while(fgets(buffer, sizeof buffer, file) != NULL){
              espace = strtok(buffer, " ");
              if(espace == NULL)
                {
          	perror("strtok");
          	exit(-1);
                }
              
              fscanf(file, "%s.%s.%s.%s", buf1, buf2, buf3, buf4);
              printf("%s\n",buffer);
            }
            
            return 0;
          }
          0
          1. Bonjour,

            est-ce quelqu'un pourrait m'aider s'il vous plait ?

            Je voudrais également savoir comment il faut que je m'y prenne pour que ne pas prendre en compte les * * * qui apparaissent parfois dans les traceroute ainsi que ces plages d'adresses IP :
            10.0.0.0 à 10.255.255.255
            172.16.0.0 à 172.31.255.255
            192.168.0.0 à 192.168.255.255
            224.0.0.0 à 239.255.255.255
            240.0.0.0 à 255.255.255.255 


            Merci
            0
            1. salut,

              une fois que tu as recupere les IP dans des cahins de type "a.b.c.d", tu peux utiliser la fonction strtok avec le point '.' comme delimiteur. De cette maniere, tu recuperes les 4 cahines "a", "b", "c", "d" que tu peux facilement convertir en entier avec atoi. Apres il te reste a tester que ces entiers correspondent a une adresse valide/autorisee.

              bon travail
              0
            2. @cataclypseBonjour,

              c'est quoi des cahins ?
              0
          2. Modérateur
            Ben c'est bizarre tu fais un fgets (donc lire une ligne dans le fichier), et ensuite au lieu de lire la ligne qui est extraite dans le buffer, tu relis une ligne avec des fscanf.

            Tu devrais utiliser un sscanf sur ton buffer, non ?

            Bonne chance
            0
            1. Bonjour,

              j'ai réecrit mon code mais au lieu d'afficher les adresses IP, je voudrais les stocker.

              Est-ce que quelqu'un pourrait m'indiquer comment faire s'il vous plait?

              Merci par avance

              Voici une partie du code, c'est la partie en gras qui permet la lecture et l'affichage de l'IP

               while (fgets(line, sizeof line, fp) != NULL)
              	{
              	  clean(line, fp);//cette fonction remplace '\n' par '\0'
              	  
              	  char *p = strtok(line, " ");
              	  if (p != NULL)
              	      {
              		p = strtok(NULL, " ");
              		if (p != NULL)
              		  {
              		    int ip[4];
              		    sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
              		    printf ("%3d %3d %3d %3d\n", ip[0], ip[1], ip[2], ip[3]);
              		  }
              		else
              		  {
              		    printf ("format error\n");
              		    break;
              		 }
              	      }
              	  else
              	    {
              	      printf ("format error\n");
              	      break;
              	    }
              	}
              
              0
              1. Modérateur
                Stocke les simplement dans une structure...
                struct ip_addr4{
                 char ip[4];
                };
                
                void show_ip(struct ip_addr4 x){
                  printf("%d.%d.%d.%d",x.ip[0],x.ip[1],x.ip[2],x.ip[3]);
                }
                
                int main(){
                  ...
                  struct ip_addr4 x;
                  sscanf(p, "%d.%d.%d.%d",&(x.ip[0]), &(x.ip[1]),&(x.ip[2]),&(x.ip[3]));
                  show_ip(x);
                  ...
                }

                Bonne chance
                0
                1. merci beaucoup
                  0

              Discussions similaires

              question pix mot caché

              7 réponses