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

Discussion :

Lecture d'un fichier INI avec QSettings ou QDataStream ?

  1. #1
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Lecture d'un fichier INI avec QSettings ou QDataStream ?
    Bonsoir tout le monde!

    Voici mon problème, j'ai créé une fonction permettant de lire un fichier ini à l'aide de QSettings seul hic, lorsque je récupère toutes les valeurs des clés en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QSettings settings(configFileName,QSettings::IniFormat);
    keyList = settings.allKeys();
    keyList contient effectivement toutes les clés sauf qu'elles sont classées par ordre alphabétique, ce qui ne m'arrange pas...

    Je m'explique, j'ai (par exemple) une structure permettant de configurer le port com décrite de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct{
    T_UINT32 PortCom;
    T_UINT32 BaudRate;
    T_UINT32 DataBits;
    T_UINT32 Parity;
    T_UINT32 StopBits;
    T_UINT32 FlowControl;
    T_UINT32 TimeOut;
    }PortComConfig;
     
    //T_UINT32 : typedef unsigned int
    Bref, lorsque je récupère les données sauvegardées depuis mon fichier ini, il en ressort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    "COMMUNICATION/CONFIG_RS232/BAUDRATE"
    "COMMUNICATION/CONFIG_RS232/COMPORT"
    "COMMUNICATION/CONFIG_RS232/DATABITS"
    "COMMUNICATION/CONFIG_RS232/FLOWCONTROL"
    "COMMUNICATION/CONFIG_RS232/PARITY"
    "COMMUNICATION/CONFIG_RS232/STOPBITS"
    "COMMUNICATION/CONFIG_RS232/TIMEOUT"
     
    // COMMUNICATION : 1er Groupe
    // CONFIG_RS232 : 2ème Groupe instanciant la structure...
    On voit bien que c'est pas dans le même ordre que lorsque je les ai sauvegardé (dans le même ordre que la structure)

    Etant donné que j'utilise un pointeur sur la structure PortComConfig, j'aurai voulu récupérer les données dans l'ordre comme ça j'incrémente la valeur du pointeur pour rentrer les données de manière "simple"...

    MA QUESTION EST DONC:
    Est-il possible de récupérer les clés du fichier ini dans l'ordre dans lequel les clés sont sauvegardées ou pas?
    Si ce n'est pas possible, comment faire? J'ai commencé à essayer d'ouvrir le fichier ini avec QDataStream (en utilisant QFile et tout ce qui suit...) mais j'ai l'impression de m'y perdre plus qu'autre chose et puis ça ne m'arrange pas d'utiliser une méthode différente de la sauvegarde...

    J'ai bien évidemment cherché sur Google et sur Developpez.net mais sans réponse satisfaisante ... (apparemment QSettings::allKeys() utilise une méthode de QList et classe par ordre alphabétique les valeurs récupérées...)

    Bref, je suis ouvert à toutes réponses et même de nouvelles méthodes pour récupérer tout ça (quitte à changer la méthode d'accès à ma structure...)


    Je vous remercie d'avance

    PS: Win7 & Qt 4.7.4

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu essayes de te faciliter la tâche en programmation mais en mettant des contraintes utilisateur supplémentaire. Un fichier .ini est un ensemble de clefs/valeurs dans lequel on se fout normalement de l'ordre. A quoi te serviraient les clefs sinon ? Donc à moins qu'il y ait vraiment une bonne raison (auquel cas vu que ce n'est plus un vrai .ini, QSettings ne pourra plus t'aider), mieux vaut remplir chaque valeur de ta struct en interrogeant la clef liée.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Merci Troudhyl, c'est ce que j'ai essayé de faire mais j'ai un sérieux doute sur les valeurs récupérées...
    Voilà comment j'ai fait:

    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
    16
    QSettings settings(configFileName,QSettings::IniFormat);
    keyList = settings.allKeys();
    for(int iter = 0; iter < keyList.size(); iter++)
    {
    if(keyList.at(iter).contains("COMPORT"))
    {
    *opt_pt_PortCom = (T_UINT32)settings.value(keyList.at(iter),0).toInt();
    opt_pt_PortCom++;
    }
    {
    if(keyList.at(iter).contains("BAUDRATE"))
    {
    *opt_pt_PortCom = (T_UINT32)settings.value(keyList.at(iter),0).toInt();
    opt_pt_PortCom++;
    }
    //etc.
    Sauf qu'en faisant comme ça, je ne contrôle pas mon pointeur... Bon en écrivant, je me rends compte qu'il suffit que je passe par une variable intermédiaire et ensuite je fais passer les valeurs de ma variable intermédiaire dans mon pointeur...

    Pour plus de simplicité d'accès, il ne serait pas mieux d'utiliser un tableau de hachage (QHash)?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu es obligé de faire des choses barbares comme un pointeur à incrémenter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QSettings settings(configFileName,QSettings::IniFormat);
    keyList = settings.allKeys();
    for(int iter = 0; iter < keyList.size(); iter++)
    {
    if(keyList.at(iter).contains("COMPORT"))
    {
    opt_pt_PortCom->PortCom = (T_UINT32)settings.value(keyList.at(iter),0).toInt();
    }
    {
    if(keyList.at(iter).contains("BAUDRATE"))
    {
    opt_pt_PortCom->BaudRate = (T_UINT32)settings.value(keyList.at(iter),0).toInt();
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    Tu es obligé de faire des choses barbares comme un pointeur à incrémenter ?
    Effectivement, c'est bien "casse-gueule" de faire comme je faisais, du coup j'ai changé le type de pointeur de "opt_pt_PortCom" qui est un pointeur de type PortComConfig au lieu d'être un pointeur de type T_UINT32...

    Merci pour l'aide !

    Petite question supplémentaire, j'ai également sauvegardé 3 tableaux booléens pour configurer des labels (suivant ce qu'a choisi l'utilisateur). Mon problème, c'est que lorsque je récupère les labels je les récupère dans l'ordre suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CONFIG_LABEL\BCD\BCD0 = true
    CONFIG_LABEL\BCD\BCD1 = true
    CONFIG_LABEL\BCD\BCD10 = false
    CONFIG_LABEL\BCD\BCD100 = false
    CONFIG_LABEL\BCD\BCD101 = true
    //etc.
    // Les chiffres représentent l'index du tableau avec la valeur correspondante
    donc j'ai voulu faire un test sur la valeur récupérée de cette manière:
    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
    16
    17
    int iBCD = 0;
    QString delimitation;
    QString* pt_String = new QString;
    bool opt_bcdLabel[LABEL_LENGTH];   // LABEL_LENGTH = 256
     
    // du code posté plus haut...
     
    if(keyList.at(iter).contains("BCD"){
       for( ; iBCD < LABEL_LENGTH-1; iBCD++){
          delimitation = pt_String->setNum(iBCD,10);
          if(keyList.at(iter).contains(delimitation)){
             opt_bcdLabel[iBCD] = settings.value(keyList.at(iter),0).toBool();
             break;
          }
       }
    }
    //idem pour les autres tableaux
    Sauf que le problème c'est que quand iBCD = 2 bah ça passe pas parce que je fais le test "trop tôt" ...

    Vous n'auriez pas une méthode plus efficace et moins prise de tête ?

    Merci par avance !

    PS: d'où ma question de tout à l'heure, serait-il plus simple d'utiliser un tableau de hachage dans ce cas là?

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Je trouve effectivement que tu fais des choses très compliquées pour quelque chose de simple (ou alors c'est parce que j'ai mal compris). Ton objet QSettings est déjà un tableau de hachage (une map plutôt). Ta façon de l'utiliser comme un simple tableau indexé est inappropriée à mon avis, d'ailleurs j'ai honte du code que je t'ai arrangé au-dessus (qu'est-ce que c'est que cet iter !! étrange façon de gérer des clefs), mais bon je ne connais pas les contraintes que peuvent t'imposer un cahier des charges. Tu es obligé d'ignorer le préfixe des clefs et de t'appuyer sur une recherche de texte dedans ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace
    {
        const QString PREFIX_BCD = "CONFIG_LABEL\BCD\BCD";
    }
     
    [...]
    QSettings settings(configFileName,QSettings::IniFormat);
    QVector<bool> opt_bcdLabel (LABEL_LENGTH);
     
    for (int i = 0; i < opt_bcdLabel.size(); i++) // pour chaque label on va lire la clef correspondante...
    {
        opt_bcdLabel[i] = settings.value(PREFIX_BCD + QString::number(i), false).toBool();
    }

  7. #7
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Excusez moi pour la réponse tardive, je suis parti en vacances... Donc, effectivement, je suis d'accord que la méthode appliquée est compliquée! Le hic c'est que je ne pense pas maitriser suffisamment Qt, j'essaie donc de trouver des tuto à gauche et à droite mais je n'arrive pas à en trouver un qui est bien expliqué et détaillé... Si jamais vous avez des recommandations, je suis preneur!

    En ce qui concerne le cahier des charges, la complexité de cette fonction ne doit pas excéder O(n*log(n)) étant donné que le cas le plus critique est considéré comme un algo de type quadratique (O(n²))...

    Ce que j'aimerais tout simplement faire (et ce qui est demandé dans le CDC) c'est de récupérer les valeurs de chaque clé du fichier *.ini pour pouvoir les charger en tant que nouveau paramètre dans l'IHM...

    J'espère que mes explications sont suffisamment claires... Je vous remercie pour votre aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2009, 10h28
  2. Réponses: 3
    Dernier message: 28/12/2007, 19h57
  3. lecture/ecriture de fichier à distance avec indentification
    Par Mat1664 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/05/2006, 17h16
  4. Réponses: 2
    Dernier message: 13/12/2004, 23h32
  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