Heim >Backend-Entwicklung >C++ >Wie kann ich mit C die Zeilennummer einer INI-Datei ermitteln, in der eine bestimmte Option oder ein bestimmter Abschnitt gefunden wird?

Wie kann ich mit C die Zeilennummer einer INI-Datei ermitteln, in der eine bestimmte Option oder ein bestimmter Abschnitt gefunden wird?

Linda Hamilton
Linda HamiltonOriginal
2024-10-25 23:04:28346Durchsuche

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

Plattformübergreifende Methode zum Abrufen der Zeilennummer einer INI-Datei, in der die angegebene Option gefunden wurde

Problem:

Suche nach einer C-Bibliothek (wie boost::program_options), die die Zeilennummer einer INI-Datei zurückgeben kann, in der eine bestimmte Option oder ein bestimmter Abschnitt gefunden wurde.

Anwendungsfälle:

  1. Bitten Sie die Bibliothek, den Wert „vvv“ im Abschnitt „[SSS]“ zu finden. Die Bibliothek sollte die Zeilennummer zurückgeben, in der „vvv“ im Abschnitt „[SSS]“ gefunden wird, oder -1. Dadurch können wir beispielsweise sagen: „Zeile 55: vvv muss < 256 sein.“
  2. Durchsuchen Sie die INI-Datei nach Abschnitten und validieren Sie deren Namen. Wenn ein unbekannter Abschnitt gefunden wird, können wir „Zeile 55: Abschnitt [Hahaha] ist unbekannt“ melden.

Antwort:

Die Möglichkeiten von Boost nutzen Spirit, eine Lösung wurde mit line_pos_iterator erstellt.

Implementierungsdetails:

  • POSITIONSINFO = 0:

    • Die Eingabe erfolgt als Streaming.
    • Die Ausgabe erfolgt im Rohstringformat oder im Map> für Abschnitte.
    • POSITIONSINFO = 1:

      • Eingabe ist gepuffert.
      • Ausgabe ist in textnode_t-Format:
      <code class="cpp">struct textnode_t {
        int sline, eline, scol, ecol;
        string_t text;
      };</code>
      • Dies ermöglicht die resultierende Karte> um die genauen Zeilen- und Spaltenanfangs- und -endpunkte für einzelne Textelemente anzugeben.
      • Kommentare (#, / ... /-Stil) sind implementiert.
      • Leerzeichen sind toleriert.
      • Das Entfernen von Schrägstrichen bleibt eine Übung.
      • Fehler werden mit vollständigen Positionsinformationen gemeldet, wenn sie aktiviert sind.
    • Code-Snippet:

      <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>

      Zusätzliche Ressourcen:

      • [Gist mit vollständigem Code, Makefile und example.ini]( https://gist.github.com/1425972)
      • [Boost Spirit-Dokumentation](https://www.boost.org/doc/libs/1_65_1/libs/spirit/doc/)

      Wichtiger Hinweis: Die bereitgestellte Lösung erfordert keine C 11-Unterstützung, wurde aber verwendet, um das Ergebnis der Analyse zu sichern.

      Das obige ist der detaillierte Inhalt vonWie kann ich mit C die Zeilennummer einer INI-Datei ermitteln, in der eine bestimmte Option oder ein bestimmter Abschnitt gefunden wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn