2010-01-25 12 views
6

Mein Programm liest eine Textdatei mit verschiedenen Textzeilen für eine Einstellungsdatei. Einige der Linien könnten sehr groß werden. Derzeit ist die Puffergröße 4096 Zeichen. Es ist möglich, dass einige Zeilen dies überschreiten könnten, sei es durch Bosheit oder aufgrund verschiedener Faktoren, die innerhalb des Programms arbeiten.Gibt es eine weit verbreitete C-Bibliothek zum Lesen von Name/Wert-Paaren aus einer Datei?

Die aktuellen Routinen waren ziemlich mühsam zu schreiben und jetzt möchte ich den möglichen Inhalt der Datei erweitern, die mehr von diesem langweiligen sich wiederholenden Code erfordern wird. (Dies ist für eine Einstellungstyp-Datei, bestehend aus name value Paaren und dem gelegentlichen Abschnittsheader. Einige numerische Werte müssen aufgrund mehrfacher Genauigkeit als Strings gelesen werden).

Die Hauptsache möchte ich eine beliebige Länge Zeile ohne Pufferüberlauf lesen. Ich habe gerade entdeckt, dass getline das für mich tun kann, aber, um Himmels willen, eine Bibliothek, die mir diese ganze Langweilerei abnehmen wird?

edit:

Ich möchte nicht zwischen dem Namen und Werte, ein Leerzeichen zu setzen ein Zeichen = gezwungen werden sollte als Trenn ausreichen.

Mit weit verbreiteter, ich meine die Bibliothek sollte in den Standard-Paketen der beliebten Linux-Distributionen verfügbar sein.

Ich bin bewusst, libconfig aber es scheint komplette Overkill für meine Anforderungen.

Antwort

1

Mein Vorschlag ist, DIY, da es ziemlich einfach ist.

  • Lesen jeder Zeile
  • Zählung Zeichen, bis der Separator und nach dem Separator
  • Puffer zuzuteilen
  • und Name-Wert-Paare gelesen mit sscanf

    wie:

    sscanf(line, "%[^:]: %[^\n]", key, value);

Sie werden sicher sein, da Sie Zeichen vor sccanf gezählt haben.

+0

in diesem Fall schlage ich auch vor, es zu schreiben, es scheint trivial genug. Das einzige Problem ist, wie Sie Ihre Tabelle speichern, wenn dies reines C ist, dann keine std :: map für Sie, aber ich nehme an, Sie haben bereits eigene Datenstrukturen? –

+0

Danke für den sscanf% [..] Tipp, aber nach dem Testen fehlt ein Caret: '"% [^:]:% [^ \ n] "', Prost, ich werde diesen Weg gehen . –

+0

Korrigiert. Entschuldigung für das fehlende Caret. – piotr

4

Schauen Sie in libini, klingt nach rechts. Es ist ziemlich alt und nicht gerade in hektischer Entwicklung, aber wenn es schon für dein Problem funktioniert, sollte das in Ordnung sein.

Eine aktuellere Bibliothek, mit einer Reihe anderer Vorteile, ist glib, es hat eine key-value-parser API.

+0

Ich habe mich gegen die Glib-Option entschieden, denn es ist wieder Overkill für meine Anforderungen. Die als richtig gewählte Antwort, obwohl sie die Bibliotheksfrage nicht direkt löst, hat es für mich einfacher gemacht, fortzufahren, und bricht keine existierende Dateispezifikation, die in den existierenden Datendateien verwendet wird. –

+1

@James: Das ist gut, denke ich ... Obwohl ich geneigt wäre, zu denken, dass für jedes nicht-triviale C-Programm glib eine gesunde Abhängigkeit zu haben ist, da es viele Dinge hinzufügt, die oft in solchen Programmen ohnehin benötigt werden. – unwind

1

Ich trug eine updated fork of libini bei CCAN bei. Es enthält auch eine sehr nützliche Wörterbuchimplementierung sowie einige einfache Hash-Algorithmen. Rusty hat es in den Repo gesteckt, also habe ich es einigermaßen gut gemacht, es auf den neuesten Stand zu bringen und die wenigen kleinen Bugs zu beheben.

Die neueste Version der Bibliothek kann gefunden werden, wenn Sie poke through this tree, es enthält grundlegende Token-Unterstützung sowie grundlegende Transaktionsunterstützung (nützlich für das erneute Lesen von Konfigurationsdateien und Zurücksetzen, wenn es ein Parsing-Fehler ist). Es enthält auch eine viel aktualisierte Reihe von Komponententests.

Ich halte die Gabel nicht mehr aktiv, da der ursprüngliche Autor von libini wieder aktiv wurde, das Modul jedoch in CCAN gepflegt ist.

Verwandte Themen