7 votes

Existe-t-il une bibliothèque C répandue pour lire des paires nom/valeur à partir d'un fichier ?

Mon programme lit un fichier texte contenant diverses lignes de texte pour un fichier de paramètres. Certaines de ces lignes peuvent devenir très volumineuses. Actuellement, la taille du tampon est de 4096 caractères. Il est possible que certaines lignes dépassent cette taille, que ce soit par malveillance ou en raison de divers facteurs opérant dans le programme.

Les routines actuelles étaient plutôt fastidieuses à écrire et maintenant je veux étendre le contenu possible du fichier, ce qui nécessitera davantage de ce code répétitif fastidieux. (Ceci est pour un fichier de type paramètres, composé de name value et l'en-tête de section occasionnel. Certaines valeurs numériques doivent être lues comme des chaînes de caractères en raison de la précision multiple).

La principale chose que je veux est de lire une ligne de longueur arbitraire sans débordement de tampon. Je viens de découvrir que getline peut le faire pour moi, mais, pour l'amour du ciel, existe-t-il une bibliothèque qui fera tout simplement tout ce travail fastidieux pour moi ?

éditer :

Je ne souhaite pas être forcé de placer une = entre le nom et les valeurs, un espace vide devrait suffire comme séparateur.

Par répandu, j'entends que la bibliothèque doit être disponible dans les paquets standards des distributions Linux les plus populaires.

Je suis au courant de libconfig mais cela semble complètement excessif pour mes besoins.

3voto

unwind Points 181987

Regardez dans libini Cela semble correct. Il est assez ancien et ne fait pas exactement l'objet d'un développement frénétique, mais s'il fonctionne déjà pour votre problème, cela devrait aller.

Une bibliothèque plus à jour, avec de nombreux autres avantages, est la suivante glib il a un API d'analyseur clé-valeur .

1voto

piotr Points 2826

Je vous suggère de bricoler, car c'est assez facile.

  • Lire chaque ligne

  • comptez les caractères jusqu'à votre séparateur et après votre séparateur

  • allouer des tampons

  • et lire les paires nom-valeur avec sscanf

    comme :

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

Vous serez en sécurité puisque vous avez compté les chars auparavant. sccanf .

1voto

Tim Post Points 21270

J'ai contribué à un mise à jour de libini à l'adresse CCAN . Il contient également une implémentation de dictionnaire très utile ainsi que quelques algorithmes de hachage simples. Rusty l'a mis dans le repo, donc je pense que j'ai fait un assez bon travail en le mettant à jour et en corrigeant les quelques bugs mineurs.

La dernière version de la bibliothèque peut être trouvée si vous passer à travers cet arbre Il contient un support de base pour les jetons ainsi qu'un support de base pour les transactions (utile pour relire les fichiers de configuration et revenir en arrière s'il y a une erreur d'analyse). Elle contient également un ensemble de tests unitaires beaucoup plus mis à jour.

Je ne maintiens plus activement le fork, car l'auteur original de libini est redevenu actif, mais le module est maintenu dans CCAN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X