Debería ser bastante fácil escribir su propio analizador si utiliza secuencias. Se puede leer un archivo usando una std::ifstream
:
std::ifstream ifs("filename.ext");
if(!ifs.good()) throw my_exceptions("cannot open file");
read_file(ifs);
Puesto que parece línea orientado, usted entonces lea primero las líneas y, a continuación, procesar éstas:
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");
}
Para el análisis real, se pudo 1)
primero eche un vistazo al primer personaje. Si es un [
, póngalo en la corriente y use std::getline(is,identifier,']')
para leer lo que esté dentro de '[' y ']'. Si no es un [
, use std::getline(is, key, '=')
para leer el lado izquierdo de un par de clave-valor, y luego std::getline(is, value)
para leer el lado derecho.
Nota: La entrada del flujo, desafortunadamente, no suele ser muy rápida. (Esto no tiene por qué ser así, pero en la práctica suele ser así.) Sin embargo, es realmente fácil de hacer y es bastante fácil hacerlo bien, una vez que conoces unos pocos patrones para trabajar con sus peculiaridades (como if(strm.good())
no es lo mismo que if(strm)
y no es lo opuesto a if(strm.bad())
y algunas otras cosas a las que tendrá que acostumbrarse). Para algo tan crítico para el rendimiento (har har!) Como leer un archivo ini del disco, debería ser lo suficientemente rápido en 999,999 de 1,000,000 de casos.
Si escribe su propio formato que probablemente tiene que escribir su propio analizador. Ver http://stackoverflow.com/questions/1669/learning-to-write-a-compiler – dmckee