Lecture fichier ini avec plusieurs clés identiques

romauto750 Messages postés 45 Date d'inscription mercredi 9 novembre 2005 Statut Membre Dernière intervention 12 janvier 2012 - 29 juil. 2008 à 15:46
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 - 29 juil. 2008 à 18:58
Bonjour à tous,

J'ai un fichier .ini qui est composé de la façon suivante :

[SECTION]
testclé=valeur1
testclé=valeur2
testclé=valeur3
...

Le nom des clés est identique et il faudrait que je récupère toutes les valeurs de testclé. J'ai trouvé la fonction GetPrivateProfileSection mais elle récupére tout dans le même tableau sous le format clé=valeur alors ce n'est pas très pratique.

Quelqu'un saurait comment faire ?  Je précise que ce n'est pas moi qui génère ce fichier et donc impossible de changer son format.

Merci.

1 réponse

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 juil. 2008 à 18:58
Salut,

Je pense que, dans les .INI, pour une section donnée, une clé doit être associée à une unique valeur, et donc, qu'il n'y a pas de fonction dans l'API win32 pour gérer des associations multiples.
Mais, comme tu sais obtenir le contenu de la section, tu es en mesure de le parser ; voici une routine qui parse ce contenu pour le placer dans un multimap ( dictionnaire dont la valeur d'une clé n'est pas forcément unique ).

#include <string>
#include <sstream>
#include <map>
...
void section_2_dico( const char * str , size_t sz , multimap< string , string > & dic )
{
    istringstream section( string( str, sz ) );
    string line , key , value ;
    while ( getline( section, line , '\0' ) )
    {
        istringstream iss( line );
        if ( getline( iss , key , '=' ) && getline( iss , value ) )
        {
            dic.insert( pair< string , string >( key , value ) );
        }
    }
}
...

Exemple d'utilisation :

int main()
{
    //lecture de la section
    const size_t max_size( 32767 );
    char tab[ max_size ];
    size_t size = GetPrivateProfileSection( "SECTION" , tab , max_size , "./test_section.ini" );

    //construction dictionnaire
    multimap< string , string > dico;
    section_2_dico( tab , size , dico );

    //affichage du dictionnaire
    for ( multimap< string , string >::iterator it = dic.begin() ; it != dic.end() ; it++ )
    {
        cout << it->first << " = " << it->second << endl ;
    }
}
0
Rejoignez-nous