jueves, 30 de octubre de 2014

Lectura secciones fichero de configuracion (.ini)

Imprimir por pantalla las secciones de un fichero de configuración (.ini) en c++.

Función base "GetPrivateProfileSection". Descripción http://msdn.microsoft.com/en-us/library/windows/desktop/ms724348(v=vs.85).aspx .

Si copia  el ejemplo :
  • Asegúrese de modificar la ruta del fichero de configuración.
  • Reserve el espacio de memoria oportuno en base al numero de sección del fichero de configuración.

CÓDIGO FUENTE (comentarios incluidos dentro del código fuente)

Funciones Base :
  •  GetPrivateProfileSection : devuelve una estructura de datos con las sección de un fichero de configuración.
Funciones Propuestas :
  •  hasSection() : Determina si la estructura devuelta por "GetPrivateProfileSection" tiene alguna sección.
  •  nextSection(); Avanza a la siguiente sección almacena dentro de la estructura de datos devuelta por "GetPrivateProfileSection".
//Ficheros cabecera
#include 
#include 
#include 
using namespace std;
//Funcionalidad : determina la existencia de secciones
//Paremetro de entrada : estructura de datos con los nombre de las secciones
//Parametro de salida : 0 no existen secciones , 1 existen secciones
int hasSections(char *§ionStructure){
    if (*sectionStructure == 0)//Hemos llegado al final de la estructura
       return 0;
    else // No hemos llegado al final
       return 1;
}
//Funcionalidad : avanzar a la siguiente sección.
//Paremetro de entrada : estructura de datos con los nombre de las secciones
//Parametro de salida : 0 no existen secciones , 1 existen secciones
int nextSectionName(char *§ionStructure){
    //incrementamos el puntero para que apunte a la siguiente sección
    sectionStructure += string(sectionStructure).size()+1;
    //nos aseguramos que no hemos llegado al final de la estructura
    return hasSections(sectionStructure);
}

//PROGRAMA PRINCIPAL
int main(){
    //fichero de configuración
    char iniFileName[100];
    //Especificamos la ruta local de un fichero de configuracion
    sprintf_s(iniFileName, 100, "C:\\Users\\invitado\\Desktop\\default.ini");
    //Estructura que almacena las secciones de un fichero de configuración
    char *sectionStructure = NULL;
    //Reservamos espacio de memoria SUFICIENTE para la estructura sectionStructure
    DWORD nSize = 300;
    sectionStructure = new char[nSize];
    //Recuperamos las secciones del fichero de configuración
    GetPrivateProfileSectionNamesA(sectionStructure, nSize, iniFileName);
    //Nos aseguramos de la existencia de al menos una sección
    if (hasSections(sectionStructure)){
       do{//por cada sección
          //imprimimos su contenido por pantalla
            cout << sectionStructure << endl;
         }while (nextSectionName(sectionStructure)); //avanzamos a la siguiente sección
    }
    system("pause");
}


Estructura del fichero de configuración probado :
[ SERCOM ]
LOG    = "Ruta local de un fichero de log"
ETIQUETAS = "Ruta local con el formato de las etiquetas"
[ Oracle ]
IP  = 192.168.0.0
ESQUEMA = XE
PUERTO  = 5503
USUARIO = admin
PASS = 
[ MYSQL ]
IP  = 192.168.0.120
ESQUEMA = maquina
PUERTO  = 1102
USUARIO = root
PASS =
[ IMPRESORA ]
IP  = 192.168.16.97
PUERTO  = 21
USUARIO = ftp
PASS =