Maison > développement back-end > C++ > le corps du texte

Comment puis-je obtenir le numéro de ligne d'un fichier INI où se trouve une option ou une section spécifique en utilisant C ?

Linda Hamilton
Libérer: 2024-10-25 23:04:28
original
258 Les gens l'ont consulté

How can I get the line number of an INI file where a specific option or section is found using C  ?

Méthode multiplateforme pour obtenir le numéro de ligne d'un fichier INI où une option donnée a été trouvée

Problème :

Recherche d'une bibliothèque C (comme boost::program_options) qui peut renvoyer le numéro de ligne d'un fichier INI où une option ou une section donnée a été trouvée.

Cas d'utilisation :

  1. Demandez à la bibliothèque de trouver la valeur "vvv" dans la section "[SSS]." La bibliothèque doit renvoyer le numéro de ligne où "vvv" se trouve dans la section "[SSS]" ou -1. Cela nous permet de dire, par exemple, "ligne 55 : vvv doit être < 256."
  2. Parcourez le fichier INI pour les sections et validez leurs noms. Lorsqu'une section inconnue est trouvée, nous pouvons signaler "ligne 55 : la section [Hahaha] est inconnue."

Réponse :

Exploiter les possibilités de Boost Spirit, une solution a été conçue à l'aide de line_pos_iterator.

Détails de mise en œuvre :

  • POSITIONSINFO = 0 :

    • L'entrée est en streaming.
    • La sortie est au format de chaîne brute, ou map> pour les sections.
    • POSITIONSINFO = 1 :

      • L'entrée est mise en mémoire tampon.
      • La sortie est en format textnode_t :
      <code class="cpp">struct textnode_t {
        int sline, eline, scol, ecol;
        string_t text;
      };</code>
      Copier après la connexion
      • Cela active la carte résultante> pour indiquer les points exacts de début et de fin des lignes et des colonnes pour les éléments de texte individuels.
      • Les commentaires (#, / ... / style) sont implémentés.
      • Les espaces sont toléré.
      • La suppression des barres obliques est laissée comme exercice.
      • Les erreurs sont signalées avec des informations de position complètes lorsqu'elles sont activées.
    • Extrait de code :

      <code class="cpp">#include <map>
      #include <string>
      #include <iterator>
      #include <boost/tuple/tuple_comparison.hpp>
      
      template <typename S = std::string, typename Cmp = std::less<S>>
      class IniFile {
      public:
          IniFile(Cmp cmp = Cmp()) : _cmp(cmp) {}
      
          IniFile(const std::string& filename, Cmp cmp = Cmp()) : _cmp(cmp) { open(filename); }
      
          void open(const std::string& filename);
      
      typedef S string_t;
      #if POSITIONINFO
          struct textnode_t {
              int sline, eline,
                  scol, ecol;
              string_t text;
      
              // ...
          };
      #else
          typedef string_t textnode_t;
      #endif
      
      typedef std::pair<textnode_t, textnode_t> keyvalue_t;
      typedef std::map<textnode_t, textnode_t> section_t;
      typedef std::map<textnode_t, section_t> sections_t;
      
      private:
          Cmp _cmp;
      };</code>
      Copier après la connexion

      Ressources supplémentaires :

      • [Gist avec le code complet, le makefile et l'exemple.ini]( https://gist.github.com/1425972)
      • [Documentation Boost Spirit](https://www.boost.org/doc/libs/1_65_1/libs/spirit/doc/)

      Remarque importante : La solution fournie ne nécessite pas le support de C 11, mais elle a été utilisée pour vider le résultat de l'analyse.

      Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!