Alors, plusieurs points me semble-t-il :
Comme l'a expliqué Archi3D, le téléphone est une chaîne de caractère, et non un nombre, puisque qu'on ne fait pas de calcul sur des numéros de téléphone, c'est essentiellement un code, qui utilise des chiffres au lieu de lettre ; je crois qu'à une époque, en Angleterre, on utilisait un mélange de lettres et de chiffres (d'où me semble-t-il un film d'Hitchcock : "Dial M like Murder"). C'est une notion qui vaut aussi pour les bases de données.
Bien sûr, ici je n'ai stocké que des chaînes de caractères, mais on peut extraire également des nombres. Je ne sais cependant pas ce que tu comptes stocker comme données, alors j'ai improvisé. Ceci-dit, je ne ne connais que la fonction C () atoi (from ascii to int, de caractère vers entier) pour convertir une chaîne en nombre, si quelqu'un a une autre solution (C++), je suis preneur .
1 2 3
|
string nb = "10";
int a = atoi(nb.c_str()); |
Pour la fameuse ligne, je vais m'expliquer :
vp.push_back(Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size())));
C'était pour faire des économies de place (et aussi pour satisfaire un goût contestable pour les formules ésotériques, je l'admets ). En fait, j'ai réuni en une seule ligne plusieurs instructions.
Tout d'abord le fichier : j'ai préféré utiliser des ';' pour séparer les données, ce qui est une technique simple et courante ; on utilise aussi parfois tabulations. Pourquoi pas des espaces ? Imaginons qu'une personne ait un nom composé de plusieurs nom, comment identifier un espace indiquant un changement de colonne et un espace indiquant un simple espace ; il vaut mieux utiliser comme séparateurs des caractères qui ne seront pas utilisés dans les données, ou le combiner avec un caractère d'échappement.
Donc, à chaque ligne, on a un ensemble de données séparées par des ';'. Le but va être d'extraire de cette chaîne des sous-chaînes (sub-string) contenant les données à récupérer. Je vais décomposer mes actions.
Tout d'abord je récupère l'emplacement des ';'.
1 2 3 4
|
size_t a, b;
a = line.find(';'); // Emplacement du premier ';'
b = line.find(';', a+1); // Emplacement du second ';' |
Ensuite, je récupère les données :
1 2 3 4
|
string nom = line.substr(0,a); // Extraction d'une sous-chaîne de la ligne
string prenom = line.substr(a+1, b-a-1); // depuis un premier caractère n° n
string tel = line.substr(b+1,line.size(); // et sur un nombre de caracètres nb |
Je crée une personne :
Personne P(nom, prenom, tel);
Et je l'ajoute :
Mais on peut remarquer que chaque objet n'est utilisé qu'une fois (sauf pour les positions de ';'). Par conséquent on peut contracter cette écriture en utilisant des objets temporaires.
Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size()))
crée un objet Personne, construit à partir de sous-chaînes extraites de la ligne, qui ne sera pas stocké dans une variable, mais directement pris en paramètre par vp.push_back(), et copié dans le vecteur, puis qui sera automatiquement détruit à la fin de l'instruction.
Bon, après, c'est un truc amusant à faire, comme faire un rébus, mais ça ne signifie pas que ce soit bien : un code lisible reste quelque chose d'important, pour diverses raisons. De plus, il faut remarquer ici que je ne fais pas de vérifications sur les données, sur le format du fichier, etc... ce qui n'est pas une bonne pratique et peut conduire à pas mal de problèmes. Mais je souhaitais ici donner simple un exemple de méthode, que je te laisse adapter de façon plus consciencieuse.
Voilà, j'espère que c'est plus clair comme ça !
(Hum, je fais peut-être des posts un peu long.)
Partager