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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
/* typedefs pour se faciliter la vie :D */
typedef std::pair<std::string, string> pairstring;
typedef std::map<pairstring> datamap;
typedef typename datamap::const_iterator dataiterator;
/* scinde la chaine fournie en paramètre par rapport au caractère "="
* qu'elle contient et renvoie une pair "clé / valeur" correspondant aux
* deux chaines récupérées
*/
pairstring splitString(std::string const & str)
{
/* je vais utiliser les stringstream, c'est plus facile :D */
std::string key;
std::string value;
std::stringstream ss;
ss<<str;
std::getline(ss,key,'=');
std::getline(ss,value);
return pairstring(key,value);
}
/* lit le fichier dont le nom est fournis en paramètre et remplis la map
* elle aussi fournie
*
* lance une exception si le fichier n'existe pas
*/
void readFile(std::string const & filename, datamap & datas
{
std::ifstream ifs(filename.c_str());// en C++11 on pourrait écrire ifs(filename) ;)
if(!ifs)
{
std::string error = "le fichier ";
error.append(filename)
.append(" n'existe pas");
throw std::runtime_error(error);
}
/* arrivés ici, on sait que le fichier existe */
std::string line;
while(std::getline(ifs, line)
{
pairstring pair = splitString(line);
datas.insert(pair);
}
}
/* affiche les clés et les valeurs comprises entre begin et end */
void print(dataiterator begin, dataiterator end)
{
while(begin != end)
{
cout<<"clé = "it->first<<" valeur = "<<it->second <<std::endl;
++begin;
}
}
/* et enfin la fonction main() */
int main()
{
datamap datas;
/* comme la lecture risque de lancer une exception */
try
{
readFile(config.conf, datas);
print(datas.begin(),datas.end);
}
catch(std::runtime_error & e)
{
std::cout<<e.what();
return 1;
}
return 0;
} |
Partager