> Tous les forums > Forum Autres langages
 Parsing d'un fichier[Langage C]Sujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
Premium
  Posté le 16/05/2006 @ 20:36 
Aller en bas de la page 
Petit astucien
Bonjour, j'ai fait le parsing de cette manière pour ne récupérer que les adresses IP Mon fichier pour le teste est le suivant : [code] 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[/code] et en sortie, j'obtiens ceci : [code] 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[/code] Il y a un problème au niveau de la première ligne qui n'est pas affichée correctement. Est-ce que quelqu'un saurait pourquoi? 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 d'avance Voici mon code : [code]#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ FILE * file = fopen("fichier","r"); char buffer[BUFSIZ]; int a,b,c,d; 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, "%d.%d.%d.%d", &a, &b, &c, &d); printf("%s\n",buffer); } return 0; }[/code] [/code]

Modifié par Premium le 16/05/2006 20:42
Publicité
breizhbugs
 Posté le 17/05/2006 à 11:39 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Salut, En fait ton 'fgets' te bouffe la premiere ligne, il faut modifier comme suit: [code]int main(void){ FILE * file = fopen("fichier","r"); char buffer[BUFSIZ]; int a,b,c,d; int numligne; //!\\ char *espace; if(file == NULL){ perror("erreur de lecture"); exit(-1); } while(fscanf(file, "%d %d.%d.%d.%d", &numligne, &a, &b, &c, &d)>0) { fgets(buffer, sizeof buffer, file);//ici on lit la fin de la ligne - qui ne nous interesse pas! printf("ligne : %d - \tIP:%d.%d.%d.%d\n",numligne, a, b, c, d); // la tu peux tester si l'ip est valide - dans la bonne plage // if (IPValide(a, b, c, d)==TRUE) // ajouteIP(a, b, c, d); } return 0; } [/code] Il faut peut etre renforcer le test de retour du fscanf egalement.

Modifié par breizhbugs le 17/05/2006 11:42
Premium
 Posté le 17/05/2006 à 13:49 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
breizhbugs a écrit :
Salut, En fait ton 'fgets' te bouffe la premiere ligne, il faut modifier comme suit: [code]int main(void){ FILE * file = fopen("fichier","r"); char buffer[BUFSIZ]; int a,b,c,d; int numligne; //!\\ char *espace; if(file == NULL){ perror("erreur de lecture"); exit(-1); } while(fscanf(file, "%d %d.%d.%d.%d", &numligne, &a, &b, &c, &d)>0) { fgets(buffer, sizeof buffer, file);//ici on lit la fin de la ligne - qui ne nous interesse pas! printf("ligne : %d - \tIP:%d.%d.%d.%d\n",numligne, a, b, c, d); // la tu peux tester si l'ip est valide - dans la bonne plage // if (IPValide(a, b, c, d)==TRUE) // ajouteIP(a, b, c, d); } return 0; } [/code] Il faut peut etre renforcer le test de retour du fscanf egalement.
Salut, merci pour le code. J'ai voulu modifier le code pour n'avoir que les IP et pas les lignes. J'ai donc enlever numligne mais à l'affichage, j'obtiens ceci :
IP:1.0.0.0 IP:2.0.0.0 IP:3.0.0.0 IP:4.0.0.0 IP:5.0.0.0 IP:6.0.0.0 IP:7.0.0.0 IP:8.0.0.0 IP:9.0.0.0 IP:10.0.0.0 IP:11.0.0.0 IP:12.0.0.0 IP:13.0.0.0 IP:14.0.0.0 IP:15.0.0.0
Ce qui correspond à la ligne complétée par des 0. POurquoi est-ce que je n'ai pas le IP ?
breizhbugs
 Posté le 17/05/2006 à 14:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Re, [code] fscanf(file, "%d %d.%d.%d.%d", &numligne, &a, &b, &c, &d) [/code] Fscanf cherche a reconnaitre un format précis: - un nombre -> le numero de ligne - un nombre -> le premier champ de l'dresse ip - un point -> le point dans l'adresse ip - un nombre - un point - un nombre - un point - un nombre -> le dernier champ dans l'adresse ip. Si tu veux pas du numero de ligne, tu le lis mais tu ne l'affiche pas: [code] while(fscanf(file, "%d %d.%d.%d.%d", &numligne, &a, &b, &c, &d)>0) { fgets(buffer, sizeof buffer, file);//ici on lit la fin de la ligne - qui ne nous interesse pas! printf("IP:%d.%d.%d.%d\n", a, b, c, d); } [/code]
Premium
 Posté le 17/05/2006 à 14:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Bonjour, j'ai oublié de préciser que les adresses IP récoltées doivent être stockées pour pouvoir créer un graphe avec. L'ordre d'apparition des adresses IP doit donc être en l'état. Est-ce que tu pourrais m'indiquer comment faire pour le stockage des IP? Merci
breizhbugs
 Posté le 17/05/2006 à 15:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Premium a écrit :
Bonjour, L'ordre d'apparition des adresses IP doit donc être en l'état.
C'est justement pour ca que recuperer le numero de ligne peut etre important. (surtout lorsque l'adresse ip n'est pas valide)
Est-ce que tu pourrais m'indiquer comment faire pour le stockage des IP? Merci
ben tu stockes les quatres composantes non? Cela dit si ton programme doit etre compatible avec IPv6, y a des choses a revoir.
Premium
 Posté le 17/05/2006 à 16:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, j'ai réecrit le code à l'aide d'un model [code]#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define F "fichier" static void purge(FILE *fp) { int c; while ((c = fgetc(fp)) != '\ ' && c != EOF) { } } static void clean (char *s, FILE *fp) { char *p = strchr (s, '\ '); if (p != NULL) { *p = 0; } else { purge (fp); } } int main() { FILE *fp = fopen(F, "r"); int **tab; int i=0; if (fp != NULL) { char line[BUFSIZ]; while (fgets(line, sizeof line, fp) != NULL) { clean(line, fp); 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; } } fclose (fp), fp = NULL; } else { perror (F); } return 0; }[/code] Dans le bout de code suivant. Une fois que la lecture est effectivement, comment faire pour stocker les IP successives au lieu de les afficher [code]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]); }[/code] Merci d'avance

Modifié par Premium le 17/05/2006 16:26
breizhbugs
 Posté le 17/05/2006 à 18:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Premium a écrit : Dans le bout de code suivant. Une fois que la lecture est effectivement, comment faire pour stocker les IP successives au lieu de les afficher [code] 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]); }[/code] Merci d'avance
Les stocker dans quoi?
Premium
 Posté le 17/05/2006 à 19:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
breizhbugs a écrit :
Premium a écrit : Dans le bout de code suivant. Une fois que la lecture est effectivement, comment faire pour stocker les IP successives au lieu de les afficher [code] 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]); }[/code] Merci d'avance
Les stocker dans quoi?
En faite pour le stokage, j'ai choisi de mettre les adresses IP dans un tableau tab_ip de type Adresse_ip. Ce type est une structure que j'ai crée. Le problème que j'ai est pour l'allocation de mon tableau_ip. Au départ, on ne sait pas combien d'IP seront stockées. Je voudrais savoir si tu pouvais m'indiquer un exemple d'allocation dynamique de tableau (d'entier par exemple) pour augmenter la taille au gré des besoins. Je voudrais avoir un model car je ne sais pas comment faire Merci d'avance
Publicité
breizhbugs
 Posté le 17/05/2006 à 21:09 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Ah ok! En fait c'est pas dur: [code] int *tab = (int *)malloc(5*sizeof(int)); // declare un pointeur et alloue 5 int. if (tab == NULL) return 1; // on remplie le tableau de donnée for (int indice = 0; indice < 5; indice++) { tab[indice]=indice; }; // maintenant si tab est trop petit: int *tmp = (int *)malloc(10*sizeof(int)); if (tab == NULL) return 1; for (int indice = 0; indice < 5; indice++) { tmp[indice]=tab[indice]; // ! penser a recopier les données dans la nouvelle zone ! }; free(tab); //on libere la premiere zone alloué tab = tmp; //on fait l'echange // on rempli des donnée a la suite des premieres for (int indice = 5; indice < 10; indice++) { tab[indice]=indice; }; free(tab); //on libere la deuxieme zone [/code] Cela dit, l'utilisation de liste est mieux en general lorsque l'on ne connait pas la taille des données.
Premium
 Posté le 18/05/2006 à 17:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, j'ai réécrit le code avec une allocation dynamique de tableau mais j'obtiens ceci à l'affichage
0.0.0.0
Est-ce que tu peux me dire ce qui cloche dans le code ? Merci [code] #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define F "fichier" typedef struct { int a; int b; int c; int d; }Adresse_ip; static void purge(FILE *fp) { int c; while ((c = fgetc(fp)) != '\ ' && c != EOF) { } } static void clean (char *s, FILE *fp) { char *p = strchr (s, '\ '); if (p != NULL) { *p = 0; } else { purge (fp); } } int main() { FILE *fp = fopen(F, "r"); int **tab; int i=0; Adresse_ip *tab_ip; int k = 1; int indice = 0; int j = 0; tab_ip = (Adresse_ip *)malloc(k * sizeof(Adresse_ip)); if(tab_ip == NULL){ perror("erreur allocation"); exit(1); } if (fp != NULL) { char line[BUFSIZ]; while (fgets(line, sizeof line, fp) != NULL) { clean(line, fp); 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); tab_ip[indice].a = ip[0]; tab_ip[indice].b = ip[1]; tab_ip[indice].c = ip[2]; tab_ip[indice].d = ip[3]; indice ++; if(indice == k) { Adresse_ip *tmp = (Adresse_ip *)malloc((k + 1) * sizeof(Adresse_ip)); if (tmp == NULL){ perror("erreur allocation"); exit(1); } tab_ip = tmp; } } else { printf ("format error\n"); break; } } else { printf ("format error\n"); break; } } fclose (fp), fp = NULL; } else { perror (F); } for(j=0; j<k; j++) { printf("%d.%d.%d.%d ",tab_ip[j].a,tab_ip[j].b,tab_ip[j].c,tab_ip[j].d); printf("\n"); } return 0; } [/code]
breizhbugs
 Posté le 18/05/2006 à 19:03 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
[code] Adresse_ip *tmp = (Adresse_ip *)malloc((k + 1) * sizeof(Adresse_ip)); if (tmp == NULL) { perror("erreur allocation"); exit(1); } tab_ip = tmp; [/code] tab_ip contient des données que tu ne recopie pas dans tmp. Relis mon code!
Premium
 Posté le 18/05/2006 à 19:52 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, j'ai rajouté les lignes qui manquait mais le problème persiste [code]if (p != NULL) { int ip[4]; sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3); tab_ip[indice].a = ip[0]; tab_ip[indice].b = ip[1]; tab_ip[indice].c = ip[2]; tab_ip[indice].d = ip[3]; indice ++; if(indice == k) { Adresse_ip *tmp = (Adresse_ip *)malloc(2 * k * sizeof(Adresse_ip)); if (tmp == NULL){ perror("erreur allocation"); exit(1); } for (j = 0; indice < k; j++) { tmp[j] = tab_ip[j]; } free(tab_ip); tab_ip = tmp; for (j = k+1; indice < 2*k; indice++) { tab_ip[j] = tmp[j]; } free(tab_ip); } }[/code]
breizhbugs
 Posté le 18/05/2006 à 20:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Je me demande si tu a vraiment le niveau pour faire ce genre de programme!
Premium a écrit : [code]if (p != NULL) { int ip[4]; sscanf(p, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); tab_ip[indice].a = ip[0]; tab_ip[indice].b = ip[1]; tab_ip[indice].c = ip[2]; tab_ip[indice].d = ip[3]; indice ++; if(indice == k) { Adresse_ip *tmp = (Adresse_ip *)malloc(2 * k * sizeof(Adresse_ip)); if (tmp == NULL){ perror("erreur allocation"); exit(1); } for (j = 0; indice < k; j++) { tmp[j] = tab_ip[j]; } free(tab_ip); tab_ip = tmp; for (j = k+1; indice < 2*k; indice++) // la case tab[k] tu la remplie quand? { tab_ip[j] = tmp[j]; } free(tab_ip); // N O N, la tu supprimes le tableau! } }[/code]


Modifié par breizhbugs le 18/05/2006 20:04
Premium
 Posté le 18/05/2006 à 20:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Ce que je ne comprends pas c'est que j'ai bien regardé, je ne vois pas d'erreur mais à l'affichage, j'obtiens toujours une ligne composée de 0

Modifié par Premium le 18/05/2006 20:15
breizhbugs
 Posté le 18/05/2006 à 20:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
teste le retour de sscanf.
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
19,99 €Carte mémoire microSDXC UHS-I SanDisk A1 Ultra 128 Go à 19,99 €
Valable jusqu'au 31 Mars

Le vendeur sérieux Base propose actuellement sur Amazon la carte mémoire microSDXC UHS-I SanDisk A1 Ultra 128 Go à 19,99 € livrée gratuitement. Cette carte mémoire offre des vitesses jusqu'à 100 Mo/s et est idéale pour les téléphones, caméras et appareils photo HD.


> Voir l'offre
48,12 €Routeur Netgear R6220 WiFi AC 1200, compatible OpenWRT à 48,12 €
Valable jusqu'au 30 Mars

Amazon fait une superbe promotion sur le routeur Routeur Netgear R6220 à 48,12 € livré gratuitement. On le trouve ailleurs à partir de 70 €. Ce routeur vous permettra de profiter du WiFi jusqu'à 1200 Mbps. Son amplificateur intégré vous permettra t'étendre la couverture de votre réseau. Le routeur dispose également de 4 prises Gigabit Ethernet. Il est compatible OpenVPN sur le firmware original et vous pourrez lui installer OpenWRT.


> Voir l'offre
67,99 €Carte mémoire SDXC UHS-I U3 SanDisk Extreme Pro 256 Go à 67,99 €
Valable jusqu'au 02 Avril

Amazon fait une superbe vente flash sur la carte mémoire SDXC UHS-I U3 SanDisk Extreme Pro d'une capacité de 256 Go qui passe à 67,99 € livrée gratuitement alors qu'on trouve la carte ailleurs à partir de 100 €. Cette carte mémoire offre des vitesses jusqu'à 95 Mo/s en lecture et 90 Mo/s en écriture et intègre des mécanismes afin de gérer l'usure des cellules de la carte et augmenter ainsi sa durée de vie. Une valeur sûre pour les plus exigeants. 


> Voir l'offre

Sujets relatifs
fichier entête langage C
langage C: recherche dans un fichier
imprimer un fichier texte(langage C)
Création d'un fichier End Of File
Extraire une image d'un fichier SWF
Apprendre les bases du langage VBA sous Excel
Créer un fichier init.lua
[Langage C] Tests unitaires
[info] Swift: Pourquoi Apple a créé un nouveau langage de programmation
Git Bash & fichier batch
Plus de sujets relatifs à Parsing d''un fichier[Langage C]
 > Tous les forums > Forum Autres langages