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
Bonjour,

je voulais programmer un répertoire, et les informations sont stockées dans des tableaux dynamiques, je voudrais que la taille des tableaux dynamique dépends de nombre de contacts saisi par l'utilisateur, cependant je rencontre des problèmes
1. Comment fait on pour sauvegarder les informations de répertoire dans un fichier et lire le fichier dans le programme après?
2. Une fois les données sont importées dans le programme, comment fait on pour configurer la taille des tableaux dynamique dépendant le nombre de contacts des données importées

Merci d'avance et je vous souhaite une bonne année 2013


A voir également:

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
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

#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
0