IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Lecture fichier INI


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut Lecture fichier INI
    Bonjour,

    je veux récupérer le contenu d'un fichier INI, j'utilise ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TCHAR tmp[255]=_T("");;
    	//LPTSTR tmp=_T("");
     
    	//Charger les paramètres à partir d'un fichier ini
    	 std::string filePath = "C:\\config.ini";
    	 std::string section="Test", key="R_0", defaultValue="";
     
    	GetPrivateProfileString((LPTSTR)section.c_str(), (LPTSTR)key.c_str(), (LPTSTR)defaultValue.c_str(), tmp, 255, (LPTSTR)filePath.c_str());
     
    	std::cout << section.c_str() << std::endl;
    	std::cout << key.c_str() << std::endl;
    	//std::cout << defaultValue.c_str() << std::endl;
    	std::cout << (LPTSTR)tmp << std::endl;
    	std::cout << filePath.c_str() << std::endl;
    le résultat obtenu est le suivant:
    0038FBC0
    c'est une adresse qui peut être celle du résultat (tmp)
    Je suis en mode Unicode et je ne veux pas le modifier en MBSC
    Comment je peut faire pour résoudre le problème?
    Merci d'avance

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 399
    Par défaut
    bonjour,

    si tu es en unicode, alors les paramètre de GetPrivateProfileString doivent être en unicode aussi et par exemple (LPTSTR)section.c_str() c'est tout sauf de l'unicode.

    quelque chose comme ça serait mieux :

    std::wstring filePath = _T"C:\\config.ini";
    std::wstring section= _T"Test", key=_T"R_0", defaultValue=_T"";

    avis perso : si tu bosses avec des TCHAR, qui donc selon les options de compil, sont compatibles ansi et unicode, il faut le faire jusqu'au bout et donc mettre du preprocesseur et utiliser string ou wstring selon la présence ou non de l'unicode.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut

    Ce qu'il y a surtout, c'est que LSPTR est un define équvalant à un pointeur sur chaine de caractères (C style) codée sur 8bits... (donc, en gros, à un char * )

    Or, un pointeur n'est jamais... qu'une adresse mémoire

    Quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	std::cout << section.c_str() << std::endl;
    	std::cout << key.c_str() << std::endl;
    ce n'est peut etre pas tout à fait faux dans le sens où tu demandes d'avoir ta chaine de caractères sous la forme "C style" (mais constante), et que tu as l'opérateur de conversion qui fait que tu arrives, au final, à récupérer une std::string pour l'affichage, mais quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << (LPTSTR)tmp << std::endl;
    la conversion "C style" utilisée fait que le système devient incapable de récupérer la chaine de caractères originelle et affiche donc, tout simplement, l'adresse à laquelle elle commence

    Supprimes simplement la conversion "C stype" (qui, soit dit en passant, devrait de toutes manières être évitée comme la peste en C++), et tu devrais récupérer quelque chose ressemblant à une valeur correcte

    N'oublies cependant pas que ce sera une valeur en forme de chaine de caractères, et qu'il te faudra donc peut etre la convertir (correctement ) en une valeur numérique adaptée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci pour vos réponses, ça m'a aidé à trouver la bonne réponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
           TCHAR t_result[255];
     
    	USES_CONVERSION;
    	LPCTSTR t_filePath = A2CT(filePath.c_str());
    	LPCTSTR t_section = A2CT(section.c_str());
    	LPCTSTR t_key = A2CT(key.c_str());
    	LPCTSTR t_defaultValue = A2CT(defaultValue.c_str());
     
    	GetPrivateProfileString(t_section, t_key, t_defaultValue, t_result, 255, t_filePath);
     
    	_tprintf (_T("File Path: %s\n"), t_filePath);
    	_tprintf (_T("Section: %s\n"  ), t_section);
    	_tprintf (_T("Key: %s\n"      ), t_key);
    	_tprintf (_T("Result: %s\n"   ), t_result);
    Ce code fonctionne bien en en Unicode et en MBCS
    le problème était dans la converstion de std::string en TCHAR, et pour cette conversion j'ai utilisé les macros ATL (A2CT)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme lecture Fichier .ini
    Par neoangelo5 dans le forum VB.NET
    Réponses: 3
    Dernier message: 14/11/2011, 08h42
  2. Lecture fichier ini
    Par ptitsoleil87 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 23/10/2009, 09h40
  3. probleme lecture fichier.ini
    Par zalalus dans le forum Access
    Réponses: 2
    Dernier message: 29/07/2009, 13h31
  4. Ecriture/ lecture fichier INI pour connexion base de données
    Par lyraaa dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/06/2007, 20h37
  5. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo