Bennu Game Development

Foros en Español => Extensiones => Topic started by: Milton884 on May 19, 2011, 07:38:43 PM

Title: mod_leeIni (Lee y modifica archivos .ini)
Post by: Milton884 on May 19, 2011, 07:38:43 PM
Que tal? me puse a hacer dos funciones, para leer y modificar valores de clave de X archivo .ini.
Para los principiantes, doy un ejemplo.

Un archivo .ini es un archivo plano de texto, que contiene secciones, claves y valores, ejemplo:

[GENERAL]
Experiencia=10
Oro=20

[ADMINS]
Admin1=Juan
Admin2=Martin


Y con estas funciones (ModificaClave y LeeClave) , podemos modificar por ejemplo el valor de:

Admin
Admin2
Experiencia
Oro..
etc.

Y leer el valor de una clave de estas, por ejemplo Admin1 que es "Juan".

Dejo el link con la libreria :)

No es gran cosa , pero es mi primer aporte y se que muchos no lo han hecho aun.

http://www.megaupload.com/?d=A13WU4F4 (http://www.megaupload.com/?d=A13WU4F4)
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: SplinterGU on May 19, 2011, 08:46:29 PM
muchas gracias! karma!
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: Outlaw on May 19, 2011, 10:28:40 PM
Muy buen aporte, y útil además! Gracias! Karma ++
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: Milton884 on May 19, 2011, 11:31:28 PM
Un gusto compartirlo con uds =).
Saluds
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: DCelso on May 20, 2011, 12:54:22 AM
y ¿como leerá esto?

[GENERAL]
Experiencia=10
Oro=20

[ADMINS]
Admin1=Juan
Admin2=Martin
Experiencia=Pepe

Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: Milton884 on May 20, 2011, 01:34:18 AM
La funcion LeeIni primero Busca la SECCION, por ejemplo si es [GENERAL], o [ADMIN], luego de ahi sigue leyendo y busca la clave, luego el valor. No se va a confundir nunca cuand pongas 2 claves iguales por lo que te dije recien.

Saludos.
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: Drumpi on May 20, 2011, 11:17:28 PM
No es gran cosa hasta que tienes que hacerlo por tu cuenta. Enhorabuena :) Karma por la iniciativa, más de un novato y algún amateur te lo agrdecerá ;)
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: DCelso on May 23, 2011, 05:58:38 PM
Quote from: Milton884 on May 20, 2011, 01:34:18 AM
La funcion LeeIni primero Busca la SECCION, por ejemplo si es [GENERAL], o [ADMIN], luego de ahi sigue leyendo y busca la clave, luego el valor. No se va a confundir nunca cuand pongas 2 claves iguales por lo que te dije recien.

Saludos.
pero entonces ¿como leemos la variable experiencia de general y luego como leemos la variable experiencia de admins?

Y si hay dos secciones con mismo nombre¿?

[GENERAL]
Experiencia=10
Oro=20

[ADMINS]
Admin1=Juan
Admin2=Martin
Experiencia=Pepe

[GENERAL]
Experiencia2=10
Oro=20

:D, toy ahí buscando las cosquillas :D
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: FreeYourMind on May 23, 2011, 06:16:58 PM
Eso es un ini mal formado para empezar...
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: Yawin on May 23, 2011, 06:32:33 PM
Pero puede pasar. Yo haría un pequeño controlador que cuando haya claves repetidas devuelva un error.
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: SplinterGU on May 23, 2011, 06:37:31 PM
eso no deberia pasar
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: l1nk3rn3l on January 03, 2012, 03:25:24 PM
lo probe con el ultimo bennu y ocasiona un crash

// include "DLLs/import.prg";

function string ModificaClave(string Ruta,string seccion,string clave,string valor)
    private
        int f1;
        int i;
        string linea;
        string linea_mod;
        string acumulado;
        bool encontrado;
        int longitud_clave;
    end
begin
    f1=fopen(ruta,O_READWRITE);
    encontrado=false; //por defecto false pero we.
    longitud_clave=len(clave);
   
    while(!(feof(f1)))
        linea=fgets(f1);

        //si encuentra la Seccion...
        if(find(linea,"[" + seccion + "]"))
            encontrado=true;
        end
       
        //si ya se encontro la seccion
        if(encontrado==true)
            //buscamos la clave y modificamos el valor
            if(substr(linea,0,longitud_clave)==clave)
                linea_mod=clave + "=" + valor;
                acumulado=acumulado + linea_mod + chr(13) + chr(10);
                encontrado=false;
            else
                if(acumulado=="")
                    acumulado=linea + chr(13) + chr(10);
                else
                    acumulado=acumulado + linea + chr(13) + chr(10);
                end
            end
        else
            if(acumulado=="")
                acumulado=linea + chr(13) + chr(10);
            else
                acumulado=acumulado+linea + chr(13) + chr(10);
            end
        end
    end

    fclose(f1);
   
    fopen(ruta,O_WRITE);
    fputs(f1,acumulado);   
    fclose(f1);
   
end


function string LeeClave(string ruta,string seccion,string clave)
    private
        int f1;
        string linea;
        bool encontrado;
        int longitud_clave;
        int pos_igual;
    end
begin
    f1=fopen(ruta,O_READ);
    encontrado=false; //por defecto false pero we.
    longitud_clave=len(clave);
    while(!(feof(f1)))
        linea=fgets(f1);

        //si encuentra la Seccion...
        if(find(linea,"[" + seccion + "]"))
            encontrado=true;
        end
       
        //si ya se encontro la seccion
        if(encontrado==true)
            //buscamos el valor de la clave
            if(substr(linea,0,longitud_clave)==clave)
                pos_igual=find(linea,"=");
                say(substr(linea,pos_igual+1));
                return substr(linea,pos_igual+1);
            end
        end
    end
   
    if(encontrado==false)
        return "nada";
    end
   
end

PROCESS main(); begin
     ModificaClave("conf.ini","OTRO","Variable3","Simio");
     loop
         if(key(_esc))
             exit(0);
         end
       
         frame;
     end
end

Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: SplinterGU on January 03, 2012, 03:29:10 PM
pudiste ver en que linea/funcion?
Title: Re: mod_leeIni (Lee y modifica archivos .ini)
Post by: l1nk3rn3l on January 03, 2012, 11:26:00 PM
no lo corri en debug solo lo ejecute y error de esos de crash general


probado en windows 7 y xp
Title: Re:mod_leeIni (Lee y modifica archivos .ini)
Post by: panreyes on March 14, 2014, 06:14:01 PM
Hola. He mejorado y creada mi propia versión del lector de INIs:


Function string ini_read(string ruta,string seccion,string clave);
Private
int fp;
string linea;
string datos;
bool encontrado;
int longitud_clave;
int pos_igual;
Begin
fp=fopen(ruta,O_READ);
encontrado=false; //por defecto false pero we.
longitud_clave=len(clave);
while(!feof(fp))
linea=fgets(fp);


if(encontrado==false)
//si encuentra la Seccion...
if(find(linea,"[" + seccion + "]"))
encontrado=true;
end
else
//si ya se encontro la seccion buscamos el valor de la clave
if(substr(linea,0,longitud_clave)==clave)
pos_igual=find(linea,"=");
datos=substr(linea,pos_igual+1);
break;
end
end
end
fclose(fp);


return datos;
end



Aún se puede optimizar más, pero así está bien. Las diferencias con el anterior son:
- Se hace un fclose tras leer el fichero (!!!)
- Si se ha encontrado ya la sección, no la seguimos buscando
- Reestilizado a mi manera xD
Title: Re:mod_leeIni (Lee y modifica archivos .ini)
Post by: panreyes on March 14, 2014, 07:17:14 PM

Y aquí otra versión en la que cargo el INI en memoria, evitando abrir el fichero INI múltiples veces:

Global
string loaded_ini_data;
End


Function load_ini(string ruta);
Begin
loaded_ini_data=file(ruta);
end


Function string read_ini(string seccion,string clave);
Private
string datos;
int pos_seccion;
int pos_siguiente_seccion;
int pos_igual;
int pos_principio_clave;
int pos_final_clave;
Begin
if((pos_seccion=find(loaded_ini_data,"["+seccion+"]"))>-1) //buscamos el principio de la sección
pos_siguiente_seccion=find(loaded_ini_data,""+chr(10)+"[",pos_seccion); //averiguamos dónde empieza la siguiente sección
if((pos_principio_clave=find(loaded_ini_data,""+clave+"=",pos_seccion))>-1) //buscamos la clave siguiente con ese nombre
if(pos_siguiente_seccion==-1 or pos_principio_clave<pos_siguiente_seccion) //que se encuentre en esa sección
pos_final_clave=find(loaded_ini_data,chr(13),pos_principio_clave); //msdos, \r
pos_principio_clave+=len(clave)+1; //detrás del =
datos=substr(loaded_ini_data,pos_principio_clave,pos_final_clave-pos_principio_clave);
end
end
end

return datos;
end