[C++] Enregistrer contenu .txt dans structure

Résolu/Fermé
Bèbère - 10 mars 2009 à 00:53
 Bèbère - 10 mars 2009 à 20:20
Bonjour,

Pour le développement personnel d'un annuaire en C++ avec un système de pointeurs, je recherches quelques précisions sur la manière de récupérer le contenu d'un fichier texte pour le sauvegarder dans une variable.

Explications: au fur et a mesure que des contacts sont rentrés dans l'annuaire, ils sont enregistrés dans un fichier texte afin de ne pas être "perdus" lors de la fermeture du programme, et je souhaite pouvoir faire l'opération inverse au démarrage de l'application et transférer les contacts du fichier texte dans mes pointeurs!

Ainsi, je souhaiterais pouvoir enregistrer séparément les quatre mots de chaque ligne (nom, prenom, tel et dateNaiss) dans leur emplacement correspondant dans ma structure:

typedef struct TPersonne

{

string nom;
string prenom;

string tel;
string dateNaiss;

TPersonne *suivant;

} Personne;

Quelqu'un pourrait m'éclairer sur la manière de procéder? Je recherche l'équivalent du cin mais pour un fichier texte en gros.. :s

Merci!
A voir également:

7 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 mars 2009 à 01:09
Il y a plein de manière de faire.

1) Tu peux stocker ton fichier texte au format tsv ou csv (une ligne par structure, chaque membre apparaît dans l'ordre séparé par un caractère spécial, par exemple tabulation pour un tsv ou ; pour un csv). Du coup il est assez simple de relire ton fichier, par exemple à l'aide des fonctions getline et strtok.
https://fr.wikipedia.org/wiki/Comma-separated_values
https://fr.wikipedia.org/wiki/Format_TSV
http://man.developpez.com/man3/getline.3.php
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strtok.3.html

- Avantages : tu ne dépends d'aucune librairie, c'est simple, et tu peux l'importer dans un tableur (par exemple OpenOffice - oocalc).

- Inconvénients : il faut le coder, c'est lent, le format n'est pas forcément simple à faire évoluer (en particulier si tu décides de rajouter des attributs pour décrire tes contacts).

2) Tu peux stocker ton fichier au format xml. Il existe plein de librairies pour manipuler des fichiers xml (lecture / écriture).
https://fr.wikipedia.org/wiki/Extensible_Markup_Language

Par exemple :
http://xerces.apache.org/xerces-c/

- Avantages :
c'est déjà codé, le format peut facilement évoluer, il existe des parseurs xml dans plein d'autres langages et donc ce format de fichier est facilement réutilisable.

- Inconvénients : il faut coupler ton PC avec une libraire et prendre le temps de voir comment ça marche, et comme c'est un fichier texte, c'est lent (il faut le lire, l'insérer dans la structure etc...).

3) Encore mieux, plutôt que de stocker ton annuaire sous forme de fichier texte (ce qui est lent à lire et à écrire quand le fichier devient très volumineux, même si tu n'en as a priori pas le besoin car je doute que tu aies plusieurs milliers de contacts), c'est d'écrire ta structure directement sous forme d'un binaire en utilisant des opérations de serialization et deserialization. Là c'est pour les barbus, et c'est ici que ça se passe :
https://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/index.html

- Avantages : c'est déjà codé, le format peut facilement évoluer, c'est la méthode la plus rapide en terme de temps d'exécution

- Inconvénients : c'est la plus compliquée (boost n'est pas facile à prendre en main), le fichier ne peut pas être facilement réutilisé par une autre application. L'utilisation de structures sérialisées impose certaines contraintes de programmation (pas de pointeurs, de référence dans les structures à sérialiser).

Bonne chance
3
Résolu en fait :p

fichlec>>TContact.nom>>TContact.prenom>>TContact.tel>>TContact.dateNaiss; //Récupération des données
0
Bonsoir,

Merci beaucoup pour ta réponse Mamiemando, je vais regarder ces solutions demain il commence à se faire tard.
Je pense que je vais partir sur la solution du format xml!

Merci beaucoup pour ta réponse complète et rapide!

Bonne fin de soirée,
Bèbère
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 mars 2009 à 12:38
De rien et bonne continuation !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[o.o]REplay Messages postés 357 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
10 mars 2009 à 13:02
Stocker tes contacts dans un fichiers texte et les mettre en mémoire à chaque démarrage va te prendre pas mal de temps suivant le nombre de contacts :/
Personnellement je te conseillerai une base de donnée.
La manipulation de mysql par exemple en C et C++ est assez simple, leur site officiel fourni les lib et des explications/exemples de chacune de leur fonction. De plus, tu pourras faire de l'indexation, accélérant considérablement la recherche dans ta base de données.
Après si tu as quelques dizaines de contacts dans ton annuaire, pas besoin de tout ça c'est sure ^^

++
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 mars 2009 à 14:01
C'est une approche qui marche bien, mais ça consiste à mettre en place une base de donnée. Elle restera moins efficace qu'une structure sérialisée si le but c'est d'initialiser des structures.
0
Bonsoir,

Merci pour ta participation [o.o]REplay!
J'avais aussi pensé à une base de données au début de ce projet mais cet annuaire ne comportera pas beaucoup de contacts, je n'aurais donc pas de problèmes de temps d'attente au démarrage de l'application.

Il ne s'agit que d'une petite application que je développe pour m'améliorer un peu en c++, surtout avec cette notion de pointeurs et d'enregistrements de données dans un fichier avec lesquels j'avais un peu de mal :s

Merci beaucoup pour vos réponses!
Bèbère
0