MOD_LeeINI mio, No me anda

Started by Milton884, September 06, 2012, 04:33:55 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Milton884



PD: YA ESTA SOLUCIONADO, PUSE UN MENSAJE EN ESTE TOPIC CON LA FUNCION FIX! Andando perfectamente, solo me falta la de ModifClave y listo, dps posteo en foro Extensiones.
Que tal? Yo el año pasado hice una libreria (prg) con dos funciones, una para modificar un valor de una clave de una determinada Seccion, y la otra funcion para leer una clave de una determinada seccion.

Bueno hace un rato lo baje, porque quiero utilizarlo, y no me anda ahora... por ejemplo:


Tengo un archivo "OBJ.txt" :
[OBJ1]
Nombre=Milton
[OBJ2]
Nombre=Juan


Y utilizo la funcion function string LeeClave(string ruta,string seccion,string clave), para leer Nombre de la seccion [OBJ2] de la siguiente manera:


...


codigo=leeClave("OBJ.txt","OBJ2","Nombre");
...


Y me devuelve "Milton", en vez de juan.. Revise pero creo que esta todo bien.. dejo el prg. con las funciones y el TXT que utilizo si lo pueden probar uds, haber si les da el mismo resultado...


Muchas gracias desde ya.


PD: YA ESTA SOLUCIONADO, PUSE UN MENSAJE EN ESTE TOPIC CON LA FUNCION FIX! Andando perfectamente, solo me falta la de ModifClave y listo, dps posteo en foro Extensiones.

Milton884

Espero alguien pueda solucionarlo porque realmente es muy util estas funciones, para el manejo de archivos de texto con secciones, Claves y valores. Para lo mas pesado e importante claro que se usa las bases de datos, pero siempre hay algo que esta bueno poner y leer de un archivo .INI, .TXT....


En fin, gracias y espero sus ayudas,

SplinterGU

no es posible que eso te haya funcionado, porque find nunca retorna 0 cuando no encuentra, sino que retorna -1... 0 es una posicion valida.

FIND:
*  Find a substring. Returns the position of the leftmost character (0 for the leftmost position) or -1 if the string was not found.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#3
permiteme hacerte una correciones al algoritmo...

- debes buscar por [seccion], hasta que encuentres un [
- debes buscar por cadenas con palabras completas como clave, o sea, que en realidad tenes que leer cada linea, separar la clave del valor y luego comparar la clave obtenida contra la clave que buscas, no hacerlo antes... por que podes tener claves como "texto" y tambien "texto_plano" y si haces un substr desde 0, hasta la len de la clave que buscas, cualquiera de las 2 lineas te dara valido.
- lo ideal seria que cargues el ini en memoria, lo modifiques en memoria y luego lo guardes, primero a un temporal y una vez que la grabacion fue exitosa, lo renombras, con esto evitas que si se guarda mal el .ini no lo perdes.... podrias poner el original como .bak antes del renombrado final.

lo que me refiero con lo de memoria es que asi te ahorras las lecturas constantes al archivo y el barrido entero del mismo si tenes que hacer muchas lecturas.

quizas un load_ini, getvalue, setvalue, save_ini... o sino, dejalo como lo tienes en cuanto a lectura y salvado, pero los 2 puntos primeros tenlos en cuenta, necesitas corregir la implementacion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

Te agradezco splinter, voy a hacer lo que me dijiste. Muchas gracias!

Milton884

#5
Señores, queria avisar que correji la funcion LeeClave, aunque ahora le puse "ReadKey" (le cambie el nombre para salir de la rutina jej), bueno dejo la funcion andando PerFecto. Por las dudas igual pruebenlo!


import "mod_file";
import "mod_string";
import "mod_say";

function string ReadKey(string ruta, string seccion, string clave)
PRIVATE
   int f1;
   int pos_igual;
   byte seccion_encontrada=0;
   
   string linea;
   string clave_leida;
   string valor;
END
   
BEGIN
   f1=fopen(ruta,O_READ); //abrimos archivo en Lectura y obtenemos el ID.

   WHILE(!(FEOF(f1)))
      linea=fgets(f1);
     

     
      IF(find(linea,"[") >= 0) //si se encuentra un corchete.. es una seccion
         IF(linea==seccion) //si encontramos la seccion, ahora vamos por la KEY y la VALUE
            seccion_encontrada=1;
         END
      END
     
      IF(seccion_encontrada==1) //si encontramos la seccion;
         pos_igual=find(linea,"=");
         IF(pos_igual!=-1) //SI ENCONTRAMOS EL SIGNO IGUAL... VAMOS a LEER LA KEY...
            clave_leida=substr(linea,0,pos_igual);
            IF(clave_leida==clave)
               return substr(linea,pos_igual+1);
            END
         END
      END
      frame;
   END //end WHILE
   
   //fclose(f1);
END


PRIVATE
   string msg;
BEGIN     
   msg=ReadKey("OBJ.DAT","[OBJ_2]","Descripcion");
   say(msg);
END



Me falta revisar la de ModificarClave() para modifciar el valor de una clave, lo posteo, y despues pongo en Extensiones un post con esta libreria hecha y FIX al 100%. Espero que les sea de utilidad..


PD: Por las dudas, la funcion se utiliza asi:


msg=ReadKey("OBJ.DAT","[OBJ]","CANTIDAD");


parametros: 1- Ruta.., 2- seccion (poner los corchetes, no olvidar) ,  3- Clave a leer su valor..
Y devuelve un String, que seria el valor =) Simple , pero muy uitil.

SplinterGU

te falta que cuando esta en una seccion y encuentra otro corchete, debe salir de la seccion, o sea, debe terminar de buscar la key.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

Estoy de acuerdo que hay que ponerle fin a la busqueda, pero yo diria mejor una vez que encuentre la Clave y se retorne el valor, hacer un Break; para salir del While, en vez de que siga leyendo mas lineas hasta encontrar un "[". Que opinas de lo que digo Splinter? Te pregunto porque se que sos un programador muy experimentado y uno de los mas grandes aca en el foro =).
Repito por si no se entendio, es poner un Break, dps de poner el Return, y no seguir leyendo mas claves hasta encontrar un " ["

SplinterGU

si encuentra la clave debe salir, pero si no la encuentra, cuando encuentra el primer [, debe salir... porque podes no tener la clave en esa seccion y tenerla en otra.

aunque podrias tener un ini con varias claves iguales... y estaria bueno poder ofrecer funciones para recuperarlas todas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2