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
| class XmlReader{
public:
void loadFromFile(std::string const & filename){
/* plusieurs possibilités s'offrent à nous:
* soit un fichier portant un nom différent a déjà été chargé, et il faudra donc "oublier" les informations
* qu'il contennait
*/
if(loaded_ && filename_!= filename)
unload();
/* soit, aucun fichier n'est chargé (ou l'on vient d'en faire "oublier" le contenu, ce qui revient au même
* et il faut donc charger le fichier dont le nom est fourni
*/
if(! loaded_){
/* on ouvre alors le fichier */
std::ifstream ifs{filename};
/* si ca ne se passe pas bien, on sort sur une erreur */
if(! ifs)
throw std::runtime_error("unable to open requested file");
/* sinon, on lance la procédure de lecture, en transmettant le fichier qui est ouvert comme paramètre */
readDatas(ifs);
/* n'oublions pas mettre le nom du fichier à jour, ainsi que le status loaded_ */
loaded_=true;
filename_=filename;
}
// arrivé ici, nous sommes sur que c'est le fichier dont le nom a été fourni qui a été chargé, et c'est
// exactement ce que l'on voulait
}
/* pour savoir si cela vaut la peine de relire le fichier ou non */
bool shouldReload(std::string const & filename) const{
if(! loaded_)
return true;
return filename_!= filename;
}
private:
/* les fonctions qui nous permettent de travailler */
void unload(){
/* tout ce qu'il faut pour faire "oublier" contenu du fichier
* à faire selon les informations que tu garde en mémoire
*/
filename_.clear();
loaded_=false;
}
void readDatas(std::istream & ifs){
/* tout ce qu'il faut pour lire le fichier
* qui peut éventuellement faire appel à des fonctions plus simples
* qui nécessiteront également l'accès au fichier (le donner comme paramètre sous la forme d'une référence
*
* toutes ces fonctions d'extractions devraient lancer une exception si, par malheur,
* elles se trouvaient dans l'incapacité de faire leur travail correctement
*/
}
/* et les données qui permettent de faire les tests */
std::string filename_;
bool loaded_{false};
}; |
Partager