...
Je savais que ca allait être un truc de ce genre (un truc compliqué je veux dire).
Bon je vais y réfléchir.
Merci pour ton aide.
...
Je savais que ca allait être un truc de ce genre (un truc compliqué je veux dire).
Bon je vais y réfléchir.
Merci pour ton aide.
Une map ? Tu veux dire une carte ?Envoyé par Miles
Non, une map en POO est un tableau associatif.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
utiliser un
std::Map
la clef est un interval
avec des function de comparaison < > ==
et la valeur est le pays
c'est pas tres compliqué quand meme
en plus c'est du csv (comma separated value)
super simple a parser, ou meme a importer dans une database.
T'utilise une database, dans quel cas plus besoin de map
A+
Bon bon bon j'ai essayé de faire une petit code schématique. Voila ce que j'ai imaginé :
Comme vous le voyez il manque des parties que j'ai remplacé par des commentaires. C'est tout simplement parce que je sais pas encore commment le faire. Sinon je voudrais bien votre avis sur ce code. On peut faire mieu ? Il y a des erreurs ? C'est nul ? Génial ? ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #include <cstdlib> #include <iostream> using namespace std; int formatIp(char *ip) { int ipFormated, a, b, c, d; // décompose l'IP // extrait les 4 valeurs numériques // stock les valeurs dans des variables a, b, c et d. // code avec des calculs : a *= (256*256*256); b *= (256*256); c *= 256; ipFormated = a + b + c + d; return ipFormated; } string database(int ipFormated, FILE *database) { int ipFrom, ipTo; char countryCode[2], countryName[20]; char string[9999] = ""; database = fopen("optimized-IP-to-Country-2003-03-01.txt", "r"); if (database != NULL) { while (fgets(string, TAILLE_MAX, database) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { // décompose la string // stock les valeurs dans les 4 variables // ipFrom, ipTo, countryCode et coountryName // comparaison avec l'IP formatée : if(ipFormated > ipFrom && ipFormated < ipTo) { return countryName; } } fclose(database); } } int main(int argc, char *argv[]) { char ip[20]; cin >> ip; // on enregistre l'IP FILE *bdd = NULL; cout << database(formatIp(ip), bdd); //affichage de la nationalité system("PAUSE"); return 0; }
J'ai pas réussi à faire le code avec la fonctions de manipulation de strings en C++, mais j'ai réussi avec les fonctions C.
Et ca marche pas ! Je sais pas du tout pourquoi. S'il vous plaît vous pouvez m'aider ?
Voici à quoi ressemble ma base de données :
Les valeurs sont séparées par des virgules.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 0,16777215,US,UNITED STATES 50331648,83886079,US,UNITED STATES 100663296,385875967,US,UNITED STATES
Voici maintenant mon code complet, sensé affichier la nationalité de l'utilisateur après que celui-ci est entré son adresse IP :
Voila. Une fois l'adresse rentrée, le prog me dit "Le pays associe a cette adresse est : " et c'est tout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 #include <cstdlib> #include <iostream> #define MAX_SIZE 9999 using namespace std; // Cette fonction retourne l'adresse IP codée // compréhensible par la base de données. int formatIp(char *ip) { char* ca; char* cb; char* cc; char* cd; int ipFormated, ia, ib, ic, id; ca = strtok(ip, "."); sscanf(ca, "%d", &ia); cb = strtok(NULL, "."); sscanf(cb, "%d", &ib); cc = strtok(NULL, "."); sscanf(cc, "%d", &ic); cd = strtok(NULL, "."); sscanf(cd, "%d", &id); ia *= (256*256*256); ib *= (256*256); ic *= 256; ipFormated = ia + ib + ic + id; return ipFormated; } // Cette fonction ouvre la base de données pour // extraire les strings qu'elle contient. // On effectue ensuite une comparaison avec l'IP codée // pour savoir si c'est elle qui correspond, // auquel cas on retourne le nom du pays. char* database(int ipFormated, FILE *bdd) { int ipFrom, ipTo; char* cIpFrom; char* cIpTo; char* countryCode; char* countryName; char string[MAX_SIZE] = ""; bdd = fopen("database.txt", "r"); if (bdd != NULL) { while (fgets(string, MAX_SIZE, bdd) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { cIpFrom = strtok(string, ","); sscanf(cIpFrom, "%d", &ipFrom); cIpTo = strtok(string, ","); sscanf(cIpTo, "%d", &ipTo); countryCode = strtok(string, ","); countryName = strtok(string, ","); if(ipFormated > ipFrom && ipFormated < ipTo) { return countryName; } } fclose(bdd); } } // Fonction principale. int main(int argc, char *argv[]) { char ip[20]; cout << "Entrez votre adresse IP" << endl; cin >> ip; // on enregistre l'IP FILE *bdd = NULL; // pour la base de données. cout << "Le pays associe a cette adresse est : " << database(formatIp(ip), bdd) << endl; //affichage de la nationalité system("PAUSE"); return 0; }
J'ai fais quelques tests pour afficher les variables ipFrom, ipTo, countryName... a chaque fois le programme m'affiche 0. Je comprends rien.
Un peu d'aide siouplaît !
Tu as regardé au débuggeur ?
Ben non, j'ai jamais appris à m'en servir. A quoi ca sert ?
Sinon tu sais d'où vient le probleme ?
Ca sert à débugger et à répondre à ta question.
ha merci ! ^^
Et concretement, ca sert à quoi le débuggage, à part débugger ?
A rien, c'est un débuggeur, ça sert à débugger... A voir l'évolution de son programme au cours de son exécution, quoi.
Youpiiii ! C'est bon ! Ca marche. C'était une petite erreur de code.
Merci beaucoup pour votre aide !
Salut !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager