Разбор файла конфигурации в C / C ++ - PullRequest
9 голосов
/ 13 сентября 2009

Я новичок, ищущий быстрый и простой способ разбора текстового файла в C или C ++ (wxWidgets)

Файл будет выглядеть примерно так (основная категория с «подобъектами»), которая появится в списке

[CategoryA]

[SubCat]

    Str1 = Test 

    Str2 = Description  

[SubCat] [End]

[SubCat]

    Str1 = Othertest
...

[CategoryA] [End]

Есть предложения?

Ответы [ 8 ]

14 голосов
/ 13 сентября 2009

Звучит так, будто вы хотите проанализировать файл, который довольно близок к INI-файлу.

Есть, по крайней мере, несколько библиотек анализатора INI: minIni , iniParser , libini , например.

13 голосов
/ 13 сентября 2009

Должно быть довольно легко написать собственный парсер для этого, если вы используете потоки. Вы можете прочитать файл, используя std::ifstream:

std::ifstream ifs("filename.ext");
if(!ifs.good()) throw my_exceptions("cannot open file");
read_file(ifs);

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

void read_file(std::istream& is) 
{
  for(;;) {
    std::string line;
    std::getline(is, line);
    if(!is) break;
    std::istringstream iss(line);
    // read from iss 
  }
  if(!is.eof()) throw my_exceptions("error reading file");
}

Для фактического разбора вы могли бы 1) сначала взглянуть на первый символ. Если это [, извлеките его из потока и используйте std::getline(is,identifier,']'), чтобы прочитать все, что находится внутри '[' и ']'. Если это не [, используйте std::getline(is, key, '=') для чтения левой части пары ключ-значение, а затем std::getline(is, value) для чтения правой части.

Примечание: ввод потока, к сожалению, обычно не очень быстрый. (Это не должно быть так, но на практике это часто бывает.) Однако это действительно легко сделать, и это довольно легко сделать правильно, если вы знаете очень мало шаблонов для работы с его особенностями ( как if(strm.good()) не то же самое, что if(strm) и не противоположность if(strm.bad()), и некоторые другие вещи, к которым вам придется привыкнуть). Для чего-то столь же критичного по производительности (хар-ха!), Как чтение ini-файла с диска, это должно быть достаточно быстрым в 999 999 из 1 000 000 случаев.

9 голосов
/ 14 сентября 2009

Вы можете попробовать Boost.Program_Options . Однако форматирование немного отличается. Ближе к файлам INI. Подкатегории сделаны так:

[CategoryA]
Option = Data

[CategoryB.Subcategory1]
Option = Data

[CategoryB.Subcategory2]
Option = Data

Также у него есть некоторые другие функции, поэтому он действительно очень полезен для ИМО.

3 голосов
/ 11 ноября 2010

Попробуйте Конфигуратор. Это простая в использовании и гибкая библиотека C ++ для анализа файлов конфигурации (от простейшего INI до сложных файлов с произвольной вложенностью и семантической проверкой) Только заголовок и кроссплатформенность. Использует библиотеки Boost C ++.

См .: http://opensource.dshevchenko.biz/configurator

1 голос
/ 13 сентября 2009

Только в Windows, GetPrivateProfileSection делает это. Он устарел в пользу реестра, но он все еще здесь и все еще работает.

1 голос
/ 13 сентября 2009

Выглядит более просто реализовать собственный анализатор, чем пытаться адаптировать существующий, с которым вы не знакомы.

Ваша структура - из вашего примера - основана на строках. Это облегчает анализ.

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

0 голосов
/ 14 сентября 2009

Если вы используете wxWidgets, я бы рассмотрел wxFileConfig . Я не использую wxWidgets, но класс поддерживает категории с подкатегориями.

0 голосов
/ 13 сентября 2009

Как насчет создания простого XML-файла? Есть много библиотек, которые могут помочь вам прочитать его, и дополнительный бонус в том, что многие другие программы / языки тоже могут читать его.

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