Существует ли распространенная библиотека C для чтения пар имя / значение из файла? - PullRequest
7 голосов
/ 25 января 2010

Моя программа читает текстовый файл, содержащий различные строки текста для файла настроек. Некоторые из линий могут стать очень большими. В настоящее время размер буфера составляет 4096 символов. Вполне возможно, что некоторые строки могут превысить это, либо из-за вредоносности, либо из-за различных факторов, действующих в программе.

Текущие процедуры было довольно утомительно писать, и теперь я хочу расширить возможное содержимое файла, что потребует больше этого утомительного повторяющегося кода. (Это для файла типа настроек, состоящего из пар name value и случайного заголовка раздела. Некоторые числовые значения должны читаться как строки из-за множественной точности).

Главное, что я хочу - это прочитать строку произвольной длины без переполнения буфера. Я только что обнаружил, что getline может сделать это для меня, но, ради всего святого, есть библиотека, которая сделает всю эту скучную работу за меня?

редактирование:

Я не хочу, чтобы между именем и значениями ставился знак =, в качестве разделителя должно быть пустое место.

В широком смысле я имею в виду, что библиотека должна быть доступна в стандартных пакетах популярных дистрибутивов Linux.

Мне известно о libconfig , но мои требования кажутся излишними.

Ответы [ 3 ]

3 голосов
/ 25 января 2010

Посмотрите на libini , звучит примерно так. Он довольно старый и не совсем подвергается безумной разработке, но если он уже работает для вашей проблемы, это будет хорошо.

Более современная библиотека с множеством других преимуществ - glib , она имеет API-анализатор значений ключей .

1 голос
/ 26 января 2010

Я предоставил обновленный форк libini на CCAN . Он также содержит очень полезную реализацию словаря и несколько простых алгоритмов хеширования. Расти поместил его в репозиторий, так что, думаю, я проделал достаточно хорошую работу, чтобы обновить его и исправить несколько мелких ошибок.

Самую последнюю версию библиотеки можно найти, если вы просмотрите это дерево , оно содержит базовую поддержку токенов, а также базовую поддержку транзакций (полезно для повторного чтения файлов конфигурации и возврата при анализе ошибка). Он также содержит гораздо более обновленный набор модульных тестов.

Я больше не поддерживаю форк, так как первоначальный автор libini снова стал активным, однако модуль поддерживается в CCAN.

1 голос
/ 25 января 2010

Мое предложение - DIY, так как это довольно просто.

  • Читать каждую строку
  • считать символы до вашего разделителя и после вашего разделителя
  • выделить буферы
  • и считывание пар имя-значение с помощью sscanf

    как:

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

Вы будете в безопасности, так как вы подсчитали символы до sccanf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...