2012-06-08 14 views
6

Esto es algo muy simple, así que quiero que sea tan simple como suena. Todo lo que quiero es cargar un montón de pares clave-valor de un archivo y rellenarlos en un mapa. Realmente no me importa cómo está estructurado el texto, siempre que sea fácil de leer.load std :: map from text file

lo que tengo ahora es:

  • xml con xsd código (exageración)
  • búfer de protocolo (también una exageración)
  • archivo de texto estilo INI genera

me gusta la sintaxis del archivo INI, pero no quiero escribir un analizador para eso. Me parece que estaría haciendo algo que mucha gente ha hecho antes que yo. ¿No hay algún tipo de biblioteca para leer archivos simples estructurados como este?

+2

formato csv es aún más simple, cada línea es un par de valores como: llave; valor. Entonces su clave/valores están separados por punto y coma. Dudo que encuentres bibliotecas para eso (pero algunas pueden existir) ya que analizarlo es muy simple. – marcinj

+1

posible duplicado de [analizador CSV en C++] (http://stackoverflow.com/questions/1120140/csv-parser-in-c) – gbjbaanb

+0

@gbjbaanb, tienes razón, la csv también debería funcionar para mí. Sin embargo, todavía estaría interesado en ver un analizador sintáctico para el formato INI estándar. –

Respuesta

7

Dado que parece querer lo más simple humanamente posible, voy a sugerir algo increíblemente simple que puede funcionar o no según el contenido de su mapa. Si los valores de los datos de su mapa son cadenas que incluyen espacios, esto no funcionará. Si son cadenas sin espacios, o numéricas, estás configurado.

Este código no está probado, pero es simple y cercano, por lo que debería estar bien incluso si no se compila del todo. Simplemente cambie KeyType y ValueType a int, string, float o lo que esté usando en el archivo.

instalar el archivo como:

key value 
key2 value2 
key3 value3 
key4 value4 

leer como:

KeyType key; 
ValueType value; 

std::map<KeyType, ValueType> myMap; 
while (infile >> key >> value) 
    myMap[key] = value; 
+2

¡Eso es muy simple! Funcionaría perfectamente para lo que estoy haciendo. Aún así, el formato no INI, pero debería funcionar –

+4

-1, la condición del bucle debe ser 'while (archivoentrada >> tecla >> valor)' y para el cuerpo del bucle 'myMap [clave] = valor;' es más simple de –

+1

Básico gran idea , pero solo para enfatizar y explicar lo que dijo Jonathan: esto no es simplemente una cuestión de estilo: la condición 'eof()' no se establece hasta después de un intento fallido de leer más allá del final (experimento mental: incluso si no en el último personaje en 'infile', ¿cómo podría saber en el' while() 'si tenía suficientes caracteres para la clave y el valor?). Por separado, y FWIW, esto puede funcionar para las claves 'std :: string' y los valores con espacios con un simple cambio a' while (getline (infile, key) && getline (infile, value)) '. –

0

Si usted está en el mundo de MS se puede utilizar

GetPrivateProfileSectionNames 
GetPrivateProfileString 
WritePrivateProfileString 

para leer desde el archivo ini o regestry . Si desea escribir Unicode, asegúrese de que un archivo recién creado obtenga la lista de materiales de UTF16.