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)
muchas gracias! karma!
Muy buen aporte, y útil además! Gracias! Karma ++
Un gusto compartirlo con uds =).
Saluds
y ¿como leerá esto?
[GENERAL]
Experiencia=10
Oro=20
[ADMINS]
Admin1=Juan
Admin2=Martin
Experiencia=Pepe
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.
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á ;)
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
Eso es un ini mal formado para empezar...
Pero puede pasar. Yo haría un pequeño controlador que cuando haya claves repetidas devuelva un error.
eso no deberia pasar
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
pudiste ver en que linea/funcion?
no lo corri en debug solo lo ejecute y error de esos de crash general
probado en windows 7 y xp
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
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