Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clase para manejo de ini - Julio Gorgé

Iniciado por ethernet, 16 de Febrero de 2003, 05:04:59 PM

« anterior - próximo »

Zaelsius

Cita de: "ethernet"uh? donde esta la sobrecarga del operador [] en el codigo del unreal? no sera la del Map ?
Si, fallo mio, es que utilizar el pc sin ratón me estresa XD.

Zaelsius

 Vuelvo a dar por saco con el IniFile...  :P

Aquí teneis una versión beta de IniFile 1.0.

Como novedades, pues la principal es la portabilidad, o sea Windows/Linux/etc.. . Tambien he añadido algunas mejoras para leer DWORD's y bueno, mejor os enseño la interfaz pública:


class IniFile
{

public:

// Constructors
IniFile();
IniFile(const char* szFilename);
~IniFile();

// File handling

int Open(const char* szFilename);
void Close();

// Data handling functions
 
int GetKey(char* szBuffer, const DWORD dwSize, const char* szSection, const char* szKey);
int GetKey(DWORD* dwValue, const char* szSection, const char* szKey);
int GetKey(int* iValue, const char* szSection, const char* szKey);
int GetKey(bool* bValue,const char* szSection,const char* szKey);

int SetKey(const char* szBuffer, const char* szSection, const char* szKey);
int SetKey(const DWORD dwValue, const char* szSection, const char* szKey);
int SetKey(const int iValue, const char* szSection, const char* szKey);
int SetKey(const bool bValue,const char* szSection,const char* szKey);
 
bool IsKeyTrue(const char* szSection, const char* szKey);
bool IsKeyFalse(const char* szSection, const char* szKey);
 
bool IsKeyLike(const char* szStringLike, const char* szSection, const char* szKey);

...

}


Funciona muy bien, pero supongo que debe haberseme escapado algo... si fueseis tan amables de probarla o mirarla un poco os lo agradeceria.  :P

Miraos el ejemplo Initest.cpp pq algunas cosas han cambiado a la hora de usar la clase y detectar errores.

Os digo de antemano que faltan más comentarios y renombrar alguna variable para no ofuscar el código en algunos sitios.

Zaelsius

 Sobre las funciones GetKey*...

Comprobar el valor de retorno de las funciones miembro es un poco rollo.. lo sé. ¿ Qué tal os pareceria la inclusión de un cuarto parámetro que incluya el valor por defecto a devolver en caso de error?

Algo como GetKey(&myint,"seccion","clave",VALOR_X_DEFECTO);
:huh:  

DraKKaR

 secundo la proposición de Zaelsius (mm creo que nunca habia escrito tu nick), es como se hace en la API de Windows y es muy útil a mi parecer.

Zaelsius

 Dicho y hecho  B)

Download "Rilís Candideit 1" en http://www.alu.ua.es/j/jgf8/code/IniFileRC1.zip

- Añadido el parámetro de valor de retorno por defecto.
- Corregidos pequeños bugs
- Quedan pequeñas cosas por arreglar pero es 100% estable y funcional
- Multiplataforma.. aunque requiere STL-port o SGI STL para compilar(eso no lo dije antes)

Zaelsius

 IniFile Release Candidate 4 disponible en:
http://www.alu.ua.es/j/jgf8/code/IniFile-RC4.zip

Cambios más importantes:

- Ya no requiere STL de SGI/STLPort para compilar.
- Testada con GCC.
- Licencia LGPL(es la adecuada no?)
- Algunos bugs solucionados.

Incluye un .cpp de ejemplo.

Zeigon

 ahora no necesito las STL, después de habermelas instalado  <_<    bueno así me obligo a aprender a manejarlas :)


aprovecho para hacerte una pregunta pq me da un error y no sé si será de tu IniFile. Yo tengo un archivo .ini:

[bart]
muestra = Images/bart.gif

[fondo]
casa = Images/casa.jpg


y quiero cargar las 2 imágenes. es en sdl, así q 1º cargo el ini y bien, cargo a bart y bien, pero el error me da cuando cargo el fondo. Vamos el error le he puesto q me lo saque por el archivo stderr si da error al cargar la imagen con SDL.

el código de la función que cargas las imágenes es este (está hecho deprisa sólo pa parobar si funcionaba):


void InitImages()
{
 
char cBuffy[256]; //Buffer para el contenido de las claves del archivo

if(ConfigFile.Open("prueba.ini")!=INI_OK)
{
 fprintf(stderr, "Error al cargar el archivo de configuración");
 exit(0);
}


//Carga fondo

if(ConfigFile.GetKey((char*)cBuffy,sizeof(cBuffy),"fondo","casa")!=INI_OK)
{
 fprintf(stderr, "Error en la búsqueda en el archivo de configuración de fondo");
 exit(0);
}

if(!(back = IMG_Load(cBuffy)))
{
 fprintf(stderr,"Error al cargar la imagen: %s\n", IMG_GetError());
 exit(0);
}

//Fin carga fondo


//Carga personaje

if(ConfigFile.GetKey((char*)cBuffy,sizeof(cBuffy),"bart","muestra")!=INI_OK)
{
 fprintf(stderr, "Error en la búsqueda en el archivo de configuración de personaje");
 exit(0);
}
 
if(!(image = IMG_Load(cBuffy)))
{
 fprintf(stderr,"Error al cargar la imagen: %s\n", IMG_GetError());
 exit(0);
}

//Fin carga personaje

}



entonces ejecuta y se sale, diciendo que no se ha podido cargar el fondo. sí lo q hago es 1º cargar el personaje, me lo carga pero el error me da otra vez en el fondo. Vamos cambiar las cargas de imágenes de orden, bart arriba y fondo abajo. Y ya no sé que hacer (aunq lo mismo cuando rehaga todo el código ya sale...) porque no es de la imagen, q si pongo IMG_Load("Images/casa.jpg") tal cual, en vez de cBuffy q es lo q devuelve el GetKey, sí q carga el fondo.

ya no sé q puede ser   :blink:  :(
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

Zaelsius

 Acabo de probar tu código(obviando los IMG_loads) y funciona bien.
Para salir de dudas podrias imprimir el valor de cBuffy entre el GetKey y el IMG_Load, asi sabrás si es el inifile lo que falla(tendrás que quitar los exit())

Usas Linux? GCC?

Zeigon

 pues nada, no me va.

he cambiado la búsqueda para que saque cBuffy a stdout, pero no escribe nada.


if(ConfigFile.GetKey((char*)cBuffy,sizeof(cBuffy),"fondo","casa")!=INI_OK)
{
 fprintf(stdout,"cBuffy = %s", cBuffy);
 fprintf(stderr, "Error en la búsqueda en el archivo de configuración de fondo\n");
 exit(0);
}

pongo el fprintf ahí pq es en ese exit donde se pira, asi q tengo q ponerlo dentro. si lo quito se me va en el exit del IMG_Load, así q...

lo q me saca el stdout es:

cBuffy = nada más.

por cierto, tengo W2000 Professional y VC++ 6. q raro es pq si encima dices q a ti te funciona...  :blink:
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

Zaelsius

 Acabo de probar el código con GCC(cygwin) y me falla, aunque en VS.NET sí funciona bien, tanto en release como en debug, y Windows 2000 :huh: .

Lo depuraré como pueda con gdb a ver que coj@#~@ pasa. Si no consigo ver nada con gdb, el lunes en la uni probaré suerte con VC6.

Zaelsius

 Pues ahora no me falla, no sé si la primera vez ha sido un espejismo o q...

Prueba en tu compilador este código concreto, con el prueba.ini que pusiste arriba:


#include <cstdio>
#include "inifile.h"

int main()
{

IniFile ConfigFile;

char cBuffy[256]; //Buffer para el contenido de las claves del archivo

if(ConfigFile.Open("prueba.ini")!=INI_OK)
{
fprintf(stderr, "Error al cargar el archivo de configuración\n");
exit(0);
}

//Carga fondo

if(ConfigFile.GetKey((char*)cBuffy,sizeof(cBuffy),"fondo","casa")!=INI_OK)
{
fprintf(stdout,"cBuffy = %s", cBuffy);
fprintf(stderr, "Error en la búsqueda en el archivo de configuración de fondo\n");
exit(0);
}

//Fin carga fondo

printf("%s\n",cBuffy);

//Carga personaje

if(ConfigFile.GetKey((char*)cBuffy,sizeof(cBuffy),"bart","muestra")!=INI_OK)
{
fprintf(stdout,"cBuffy = %s", cBuffy);
fprintf(stderr, "Error en la búsqueda en el archivo de configuración de personaje");
exit(0);
}

printf("%s\n",cBuffy);

//system("pause");
//Fin carga personaje

}



Si alguien se aburre mucho en su casa que pruebe si le funciona  :blink:

Edit: Zeigon, ¿el initest.cpp que viene en el último paquete te funciona?

ALRAZ

 Pregunta estúpida:

Qué tal si lo que quiero es tener una sección, donde el usuario le ponga nombre a las variables?
Algo como:



;Los números representa el gráfico que se utilizará en cada frame de la animación

[Animaciones]
Parado = 1, 2, 3, 3, 3, 3, 2, 2, 1
Andando = 5, 6, 7, 8, 9, 10, 11, 10, 9, 8, 7, 6, 5



sería bueno tener una función como


GetKey (Destino, NombreSeccion, VariableN)

y recorrer todas las variables de una sección en un ciclo:



char Tmp [256], Valor;
unsigned int Contador;

   while ( (Valor = GetKey (Tmp, "Animaciones", Contador ++)) == INI_OK)
   {
             // Aquí Tmp sería el nombre de la variable encontrada en la posición Contador
          //y Valor contendría .... pos eso XD el valor de la variable
    }
 


Inclusive, se podría usar el valor de Tmp  para hacer otra llamada a GetKey, pasando
Tmp como nombre de la variable que buscamos.

La función regresaría algo distinto a INI_OK cuando la variable N no se encuentre en dicha sección
Es decir: La sección tiene menos de N variables.

espero la idea sea factible  :)

Zaelsius

 Hola Alraz. Tu idea es buena, me la apunto para implementarla pronto. Te recomiendo que descargues la última versión de IniFile desde http://www.lemonteam.com (está incluida en un paquete llamado LemonGT).

ALRAZ

 Wenas


ZaelSius:
estuve manoseando un poco el código de tu clase para manejar archivos .Ini

y le agregué un poco de funcionalidad. Si te interesa te puedo enviar los archivos modificados para que le eches un ojo.

Funcionalidad agregada:
-Método para obtener el nombre de una sección, dada su posición en el archivo .Ini (es decir "Dame el nombre de la tercera sección")
-Método para saber cuanta secciones tiene el archivo Ini
-Método para saber si una sección existe (HasSection (NombreDeLaSeccion)
-No distingue entre mayúsculas y minúsculas! case-sensitiveless rulez!

también corregí algunos errores leves, como el hecho de que el método CacheSections no ignoraba los comentarios.

Zaelsius

 Hace poco reescribí la clase, simplificando mucho el código internamente, y dejándola en un sólo .H

inifile.h

Ahora debería ser mucho más fácil de leer y modificar :ph34r: . A ver si actualizado la página de una vez, y saco el inifile de la libreria LemonGT(que la tengo super abandonada :P). Esta versión funciona correctamente en Win/Linux/Mac. La antigua hacía alguna cosa rara al reescribir los ficheros en un SO. Tambien le he puesto licencia ZLib, más permisiva que la LGPL.

Pues nada, si te animas a aplicarle los cambios... mira el código, es realmente sencilla ahora.

Para enviarme cosas, usa julio ((en)) lemonteam ((punto)) com






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.