Должно быть довольно легко написать собственный парсер для этого, если вы используете потоки. Вы можете прочитать файл, используя 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 случаев.