[C]Parsing d'un fichier

Résolu/Fermé
Primitif - 15 mai 2006 à 12:02
 abf - 20 mai 2008 à 13:29
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
A voir également:

8 réponses

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

Merci
0
mamiemando Messages postés 33458 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
15 mai 2006 à 21:24
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
Primitif > cataclypse
17 mai 2006 à 12:28
Bonjour,

c'est quoi des cahins ?
0
mamiemando Messages postés 33458 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
16 mai 2006 à 23:51
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
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
mamiemando Messages postés 33458 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
19 mai 2006 à 20:40
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
merci beaucoup
0