[C]Parsing d'un fichier
Résolu/Fermé
A voir également:
- [C]Parsing d'un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
8 réponses
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
15 mai 2006 à 21:24
Le mieux c'est de regarder ces deux fonctions : sous linux ou dans google tape :
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
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
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
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; }
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 :
et en sortie, j'obtiens ceci :
Il y a un problème au niveau de la première ligne, pourquoi ?
Voici mon code :
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; }
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 :
Merci
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
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
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
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
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
Tu devrais utiliser un sscanf sur ton buffer, non ?
Bonne chance
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
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; } }
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
19 mai 2006 à 20:40
Stocke les simplement dans une structure...
Bonne chance
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