mod_leeIni (Lee y modifica archivos .ini)

Started by Milton884, May 19, 2011, 07:38:43 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Milton884

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

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Muy buen aporte, y útil además! Gracias! Karma ++
"Life is cheap when the bounty is high"

Milton884


DCelso

y ¿como leerá esto?

[GENERAL]
Experiencia=10
Oro=20

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

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Milton884

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.

Drumpi

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á ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

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
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Eso es un ini mal formado para empezar...

Yawin

Pero puede pasar. Yo haría un pequeño controlador que cuando haya claves repetidas devuelva un error.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

l1nk3rn3l

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


SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

l1nk3rn3l

no lo corri en debug solo lo ejecute y error de esos de crash general


probado en windows 7 y xp

panreyes

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