...
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.
Version imprimable
...
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 ?Citation:
Envoyé par Miles
Non, une map en POO est un tableau associatif.
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:
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:
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:
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 ? :mrgreen:
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 !