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 :

premier code : qu'en pensez-vous ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut premier code : qu'en pensez-vous ?
    Bonjour à tous.

    Je vous ai pas mal sollicité durant ces derniers jours. Et je vous remercie pour votre aide.

    J'aurais souhaité vous proposer mon premier code en C++ pour recueillir vos observations et surtout valider ma compréhension de l'esprit C++ au travers de cette fonction.

    Elle doit aboutir à la lecture d'un fichier settings.ini qui donne notamment le chemin et le nom du fichier bdd, ainsi que les paramètres de connexion d'un ftp local. Les valeurs lues sont ensuite passées à un map parametres pour exploitation ultérieure.

    L'entête :
    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
     
    #ifndef INITIALISATION_H
    #define INITIALISATION_H
     
    #include <map>
     
    class initialisation
    {
    public:
        initialisation();
    private:
        bool checkInit();
        std::map<std::string,std::string> parametres;
        std::map<std::string,std::string>::iterator itparam;
    };
     
    #endif // INITIALISATION_H
    le source :
    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
    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
     
    #include "initialisation.h"
    #include <iostream>
    #include <string>
    #include <fstream>
     
     
    initialisation::initialisation()
    {
        if(!checkInit()) // 1 - vérifier si settings.ini existe.
        {
            std::cout << "le fichier settings.ini est absent, illisible ou incomplet" << std::endl;
            //ici procédure de paramétrage
        }
        else
        {
            std::cout << "le fichier settings.ini est present" << std::endl;
            //ici procédure de connexion
        }
    }
     
    bool initialisation::checkInit()
    {
        std::ifstream i("settings.ini", std::ios::in);
        std::string ligne, str_to_find = "=", membreGauche, membreDroit;
        if (!i) {
            return(false);
        }
     
        while(std::getline(i, ligne))
        {
            if (ligne.find(str_to_find) != std::string::npos)
            {
              membreGauche = ligne.substr(0,ligne.find("="));
              membreDroit = ligne.substr(ligne.find("=")+1);
     
              if(membreGauche == "" || membreDroit == "")
              {
                  return(false);
              }
              parametres [membreGauche] = membreDroit;
            }
        }
     
        i.close();
     
        return(true);
    }
    Le fichier settings.ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [DB_SETTINGS]
    PATH=/.
    FILENAME=WesData.db
     
    [WES]
    IP=192.168.1.99
    PORT=21
    IDENTIFIANT=admin
    MDP=motdepasse
    Merci pour vos remarques.

    PS : j'ai tenté le passage du fichier dans un buffer, mais le while ne fonctionnait pas sur le buffer. Comme ce fichier n'est lu qu'une fois, j'ai opté pour une lecture directe du fichier.

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour.

    Première remarque :
    Ta fonction initialisation::checkInit signale les erreurs à la fonction appelante sous la forme d'un simple booléen. Ce booléen, quand il est faux, n'informe pas sur la cause de l'erreur.
    Une solution plus adaptée serait de lever une exception. Plus d'informations dans la FAQ C++.

    Deuxième remarque, indépendante du langage :
    Ta classe initialisation cumule trop de rôles. A mon avis, il faudrait au moins trois classes différentes :
    • Une classe qui modélise n'importe quel fichier INI, pour éviter de recoder la même chose chaque fois qu'il faut traiter un nouveau type de fichier INI :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      class FichierIni
      {
      private:
          std::map< std::string, std::map<std::string,std::string> > m_sectionClefValeur;
      public:
          FichierIni();
          explicit FichierIni(const std::string& adresseFichier); // Lève une exception en cas de problème de format.
          std::string getValeur(const std::string& section, const std::string& clef) const;
          void        setValeur(const std::string& section, const std::string& clef, const std::string& valeur);
          void        ecrireFichier(const std::string& adresseFichier) const; // Lève une exception en cas d'échec d'écriture.
          // ...
      };
      Il faudra d'ailleurs vérifier si cette classe n'existe pas déjà dans les bibliothèques que tu utilises. Cela évitera de réinventer la roue.
    • Une classe qui modélise settings.ini :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      class SettingIni
      {
      public:
          explicit SettingIni(const std::string& adresseFichier);
              // Utilise la classe FichierIni pour lire le fichier,
              // vérifie que les infos obligatoires y sont et
              // vérifie que ces infos sont cohérentes.
              // Lève une exception en cas d'erreur.
       
          std::string getCheminDatabase() const; // valeur de la clef PATH de la section [DB_SETTINGS]
       
          // ...
      };
    • Une classe pour se connecter à la base de données et interagir avec :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      class Bdd
      {
      public:
          Bdd(/* parametres */); // Se connecte à la base de données.
          ~Bdd(); // Se déconnecte de la base de données, si pas déjà déconnecté. Écrit dans un log en cas d'échec de déconnexion.
          void deconnexion(); // Se déconnecte de la base de données. Lève une exception en cas d'échec de déconnexion.
          // ...
      };

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    Réponse très didactique, j'apprécie beaucoup.

    Les exceptions : c'est vrai que je ne suis pas encore arrivé à ce chapitre dans ma lecture (mais il s'approche). Donc je repasse en mode lecture et je recompose le code en fonction.

    La lecture des fichiers ini : j'ai beaucoup cherché, mais rien trouvé. j'en suis très étonné d'ailleurs. On en trouve des toutes faites dans le Cbuilder et en VB et VisualC++. De surcroît Microsoft donne des fonctions de compatibilité pour les OS 16bit, mais précise que les fichiers ini ne doivent plus être et qu'il faut maintenant utiliser la base de registre, ce que je ne veux pas faire.

    Quant à en faire plusieurs classes, oui j'y avais pensé. J'ai aussi trouvé que ça faisait beaucoup de petits codes dans beaucoup de fichiers. J'ai d'ailleurs pu évoquer dans un autre post le fait de créer une bibliothèque perso pour les agréger.

    Je continue dans mon apprentissage mais visiblement tu n'as pas levé d'incohérence (plutôt des optimisations) dans ce que j'ai proposé.

    Merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    et qu'il faut maintenant utiliser la base de registre, ce que je ne veux pas faire.
    Il y a bien des avantages à la base de registre.

    Les primitives de lecture pour les fichiers ini dans Win32 fonctionnent toujours, pourquoi réinventer la roue ?

    Ok, la roue de M$ est pas super-ronde non plus.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    Les primitives de lecture pour les fichiers ini dans Win32 fonctionnent toujours, pourquoi réinventer la roue ?
    Parce que la roue semble avoir été crevée...

    Car vraiment, j'ai cherché une réponse mais rien à faire.

    Ce seraient des fonctions telles que GetPrivateProfileString( ) ou WritePrivateProfileString() ?

    Merci pour les précisions.

    PS : j'avais bien trouvé ceci : http://docwiki.embarcadero.com/RADSt...nd_TMemIniFile mais j'ai été dans l'incapacité de le mettre en œuvre.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    GetPrivateProfileString( ) ou WritePrivateProfileString()
    Oui, entre autres.

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par KonTiKI Voir le message
    Ce seraient des fonctions telles que GetPrivateProfileString( ) ou WritePrivateProfileString() ?
    Chaque bibliothèque à son interprétation d'un fichier ini

    Par exemple, Microsoft n'autorise pas d'espaces en début de lignes. D'autres si.

  8. #8
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par KonTiKI Voir le message
    PS : j'avais bien trouvé ceci : http://docwiki.embarcadero.com/RADSt...nd_TMemIniFile mais j'ai été dans l'incapacité de le mettre en œuvre.
    Tu travailles avec C++ Builder ?
    Si oui, TIniFile et TMemIniFile sont appropriés.
    Sinon, tu ne peux pas utiliser les classes de Embarcadero.

    Citation Envoyé par bacelar Voir le message
    Ça fait plus de 20ans que les .ini sont au cimetière de l'informatique
    De mon côté, j'ai travaillé et je travaille sur des logiciels qui utilisent des fichiers INI.
    Dans certains cas, le choix du format INI n'était pas judicieux et il aurait été mieux que ce soit du XML.
    Mais, si, les fichiers INI existent encore.

Discussions similaires

  1. que pensez vous de ce code (Création source ODBC)
    Par aimer_Delphi dans le forum Débuter
    Réponses: 1
    Dernier message: 26/05/2010, 14h47
  2. Que pensez vous d'un collecteur/assembleur de code?
    Par zintelix3d dans le forum Débuter
    Réponses: 2
    Dernier message: 18/05/2008, 17h10
  3. Premier programme en C, qu'en pensez-vous?
    Par beware dans le forum Débuter
    Réponses: 49
    Dernier message: 26/12/2007, 13h37
  4. Que pensez-vous de mon code?
    Par vincs72 dans le forum Langage
    Réponses: 16
    Dernier message: 20/08/2007, 20h07
  5. que pensez vous de mon code source ecrit en c++(je debute)
    Par superspike23 dans le forum Débuter
    Réponses: 6
    Dernier message: 06/10/2005, 18h26

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