Probleme de tableau dynamique et de sauvegarde/lecture
Fermé
YY
-
Modifié par YY le 31/12/2012 à 22:19
mamiemando Messages postés 33344 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 novembre 2024 - 5 janv. 2013 à 01:32
mamiemando Messages postés 33344 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 novembre 2024 - 5 janv. 2013 à 01:32
A voir également:
- Probleme de tableau dynamique et de sauvegarde/lecture
- Tableau croisé dynamique - Guide
- Logiciel de sauvegarde - Guide
- Code ascii tableau - Guide
- Confirmation de lecture whatsapp - Guide
- Tableau word - Guide
1 réponse
mamiemando
Messages postés
33344
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
7 novembre 2024
7 803
Modifié par mamiemando le 5/01/2013 à 01:34
Modifié par mamiemando le 5/01/2013 à 01:34
Pour écrire dans un fichier en C++ tu vas par exemple coder un opérateur << qui écrit dans un std::ostream. Ça permettra d'écrire dans la console ou dans un fichier.
Exemple : exemple avec une classe plus simple
toto.hpp
main.cpp
Maintenant dans ton cas tu veux stocker un nombre dynamique d'objets. Pour faire simple je vais prendre des objets de type std::string, mais ça pourrait être notre objet toto (sous réserve de définir l'opérateur <).
Supposons que tu veuilles un ensemble de n strings 2 à 2 distinctes, à ce moment là le container le plus adapté est un std::set.
https://forums.commentcamarche.net/forum/affich-37604421-introduction-a-la-stl-en-c-standard-template-library
http://www.cplusplus.com/reference/set/set/
annuaire.hpp
Si comme je le disais plus haut, au lieu d'utiliser un std::string tu voulais utiliser une autre classe (mettons toto_t), il faudrait que cette classe ait un opérateur < pour pouvoir utiliser le type std::set<toto_t>. Ainsi il faudrait rajouter dans toto.hpp par exemple ceci :
Normalement avec ça tu peux au moins gérer l'écriture d'un "annuaire" initialisé à partir de ton programme. Maintenant reste à voir la lecture. Dans les conventions que j'ai adoptées, un contact (un toto_t) est écrit sur une ligne, et chaque élément du contact est séparé par des espaces. Il suffit donc d'ouvrir le fichier en lecture avec un std::ifstream (même principe que pour le std::ofstream), le lire ligne par ligne avec std::getline, et lire chaque mot de la ligne avec par exemple std::strtok.
http://www.cplusplus.com/reference/string/string/getline/
http://www.cplusplus.com/reference/cstring/strtok/
Une fois le contact lu, il suffit de l'insérer dans l'annuaire avec la méthode insert.
Exemple :
Bonne chance
Exemple : exemple avec une classe plus simple
toto.hpp
#ifndef TOTO_HPP #define TOTO_HPP #include <ostream> struct toto_t { int x; int y; toto_t(int x0, int y0): x(x0), y (y0) {} }; inline std::ostream & operator << ( std::ostream & out, const toto_t & toto ) { out << toto.x << '\t' << toto.y << std::endl; return out; } #endif
main.cpp
#include <fstream> #include "toto.hpp" int main() { toto_t toto(5, 4): std::ofstream ofs("toto.txt"); if (ofs) { ofs << toto; ofs.close() } return 0; }
Maintenant dans ton cas tu veux stocker un nombre dynamique d'objets. Pour faire simple je vais prendre des objets de type std::string, mais ça pourrait être notre objet toto (sous réserve de définir l'opérateur <).
Supposons que tu veuilles un ensemble de n strings 2 à 2 distinctes, à ce moment là le container le plus adapté est un std::set.
https://forums.commentcamarche.net/forum/affich-37604421-introduction-a-la-stl-en-c-standard-template-library
http://www.cplusplus.com/reference/set/set/
annuaire.hpp
#ifndef ANNUAIRE_HPP #define ANNUAIRE_HPP #include <set> #include <string> #include <ostream> typedef std::set<std::string> annaire_t; inline std::ostream & operator << ( std::ostream & out, const annuaire_t & annuaire ) { for(annuaire_t::const_iterator annuaire_it = annuaire.begin(); annuaire_it != annuaire.end(); ++annuaire_it) { out << *annuaire_it << std::endl; } return out; } #endif
Si comme je le disais plus haut, au lieu d'utiliser un std::string tu voulais utiliser une autre classe (mettons toto_t), il faudrait que cette classe ait un opérateur < pour pouvoir utiliser le type std::set<toto_t>. Ainsi il faudrait rajouter dans toto.hpp par exemple ceci :
inline bool operator < ( const toto_t & toto1, const toto_t & toto2 ) { return toto1.x < toto2.x || (toto1.x == toto2.x && toto1.y < toto2.y); }
Normalement avec ça tu peux au moins gérer l'écriture d'un "annuaire" initialisé à partir de ton programme. Maintenant reste à voir la lecture. Dans les conventions que j'ai adoptées, un contact (un toto_t) est écrit sur une ligne, et chaque élément du contact est séparé par des espaces. Il suffit donc d'ouvrir le fichier en lecture avec un std::ifstream (même principe que pour le std::ofstream), le lire ligne par ligne avec std::getline, et lire chaque mot de la ligne avec par exemple std::strtok.
http://www.cplusplus.com/reference/string/string/getline/
http://www.cplusplus.com/reference/cstring/strtok/
Une fois le contact lu, il suffit de l'insérer dans l'annuaire avec la méthode insert.
Exemple :
#include "annuaire.hpp" #include "toto.hpp" int main() { annuaire_t annuaire; // Lecture des contacts, ici j'initialise toto1 et toto2 en dur toto_t toto1(5, 4); toto_t toto2(3, 2); // Ajout des contacts dans l'annuaire annuaire.insert(toto1); annuaire.insert(toto2); // On écrit dans le fichier std::ofstream ofs("annuaire.txt"); if (ofs) { ofs << annuaire; ofs.close() } return 0; }
Bonne chance