2010-01-25 20 views
6

Mi programa está leyendo un archivo de texto que contiene varias líneas de texto para un archivo de configuración. Algunas de las líneas podrían ser muy grandes. Actualmente el tamaño del buffer es 4096 caracteres. Es posible que algunas líneas puedan exceder esto, ya sea a través de la malicia o debido a varios factores que operan dentro del programa.¿Existe una amplia biblioteca de C para leer pares de nombre/valor de un archivo?

Las rutinas actuales eran bastante tediosas de escribir y ahora quiero ampliar los posibles contenidos del archivo que requerirán más de este tedioso código repetitivo. (Esto es para un archivo de tipo de configuración, que consta de name value pares y el encabezado de sección ocasional. Algunos valores numéricos deben leerse como cadenas debido a la precisión múltiple).

Lo principal que quiero es leer una línea de longitud arbitraria sin desbordamiento de búfer. Acabo de descubrir que Getline puede hacer esto por mí, pero, ¿existe una gran biblioteca que me haga todo este aburrimiento?

edición:

No deseo ser obligado a colocar un signo = entre el nombre y los valores, un espacio en blanco debe ser suficiente como separador.

Por extendida, me refiero a que la biblioteca debería estar disponible en los paquetes estándar de las populares distribuciones de Linux.

Estoy al tanto de libconfig pero parece exagerado para mis requerimientos.

Respuesta

1

Mi sugerencia es, bricolaje, ya que es bastante fácil.

  • Lea cada línea
  • caracteres recuento hasta que el separador y después de su separación
  • asignar memorias intermedias
  • y leer pares de nombre y valor con sscanf

    como:

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

Estará a salvo ya que contó caracteres antes del sccanf.

+0

en este caso, también sugiero escribirlo, parece bastante trivial. El único problema es cómo almacenará su tabla, si esto es puro C, entonces no std :: map para usted, ¿pero supongo que usted ya tiene sus propias estructuras de datos? –

+0

Gracias por el consejo de sscanf% [..], pero después de la prueba, te falta un símbolo: '"% [^:]:% [^ \ n] "', salud, voy a seguir este camino . –

+0

Corregido. Perdón por el caret perdido. – piotr

4

Mire en libini, suena bien. Es bastante viejo y no está experimentando un desarrollo frenético, pero si ya funciona para su problema, debería estar bien.

Una biblioteca más actualizada, con un montón de otros beneficios, es glib, tiene un key-value-parser API.

+0

He decidido no utilizar la opción glib ya que, de nuevo, es excesiva para mis requisitos. La respuesta elegida como correcta, aunque no resuelve directamente la pregunta de la biblioteca, me ha facilitado continuar y no rompe ninguna especificación de archivo existente en uso en los archivos de datos existentes. –

+1

@James: Está bien, supongo ... Aunque me inclinaría a pensar que para cualquier programa C no trivial, glib es una dependencia saludable ya que agrega muchas cosas que a menudo se necesitan en tales programas de todos modos. – unwind

1

Contribuí updated fork of libini en CCAN. También contiene una implementación de diccionario muy útil, así como algunos algoritmos de hashing simples. Rusty lo puso en el repositorio, así que supongo que hice un buen trabajo al actualizarlo y solucionar los errores menores.

La última versión de la biblioteca se puede encontrar si poke through this tree, contiene compatibilidad básica de tokens, así como compatibilidad básica de transacciones (útil para volver a leer los archivos de configuración y revertir si hay un error de análisis). También contiene un conjunto de pruebas unitarias mucho más actualizado.

Ya no mantengo activamente la horquilla, ya que el autor original de libini se activó nuevamente, sin embargo, el módulo se mantiene en CCAN.

Cuestiones relacionadas