Lectura de cadenas formateadas

Started by DCelso, August 17, 2008, 11:49:59 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Hola a todos, estoy haciendo un cliente en fenix (puesto que para bennugdwip2 no encontré la network.dll) y necesito funciones sscanf y sprintf para poder leer y enviar los mensajes entre el cliente y el servidor. Resulta que no encuentro funciones análogas en fenix tipo como seria en C :sscanf(mensaje,"%s %d", comando,& valor)
Si no existe,¿sería facil de hacer algun port en dll o se os ocurre alguna otra forma de leer de un mensaje (tipo string) una cadena de longitud variable seguida de un espacio y seguida de un número de longitud variable?
Gracias de antemano
Monstruos Diabólicos

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

animanegra

Si estas rehaciendo la network ¿porque no usas el propio c y le das a fenix las variables ya troceadas? Es decir, estas haciendo la libreria en c para usarla en bennu ¿no?
"PoCoYo es dios!!"

DCelso

No, estoy usando fenix y network.dll para hacer un cliente que se conectará a un servidor que me devuelve ese tipo de mensajes.
No he hecho ninguna dll propia, simplemente uso la network en mi desarrollo.
Monstruos Diabólicos

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

SplinterGU

No te recomiendo pensar en usar sscanf o sprintf, ya que son consumidoras de tiempo, por otro lado, argumentos variables no son soportados en Bennu, por ende hacer una funcion de este estilo no es posible...
Pero si lo que necesitas es hacer un parseador, podes usar SPLIT, para dividir el mensaje en palabras que podes ir interpretando.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Ahora mismo estoy con Fenix intentando leer las lineas de un fichero de texto donde se encuentran los valores de daño y nombres de algunas armas, linea a linea. Está editado a mano con el Bloc de notas de Windows y tengo un problema análogo:

En primer lugar fgets(); no me lee una linea completa, es decir, nunca llega al salto de linea y deja de leer cuando encuentra cualquier caracter no numérico.

En segundo lugar he usado file(); para obtener el texto completo del fichero, pero en mi documentación de Fenix no veo funciones para "cortar" strings.

¿Ese SPLIT del que hablas sirve para eso?, ¿También está en Fenix?, ¿Dónde puedo encontrar su descripción?

Es eso o crearme una librería propia para cadenas... Y esas cosas no gustan :(
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Rectifico!

Sí, split() está en mi documentación de Fenix, la había dejado a un lado porque esperaba encontrar algo mejor, pero me sirve al menos para cerrar el módulo que carga datos desde fichero. Ahora sólo tengo que separar y con atoi() ya está todo listo. Este foro es la kaña!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

TYCO

Pásate por las Wiki donde están la mayoría de las funciones y variables (locales y globales):

Bennu Wiki
Fenix Wiki

Las dos Wiki contienen funciones y variables funcionales en Bennu.

FGETS (INT fichero)

FGETS lee una cadena de texto de un fichero y la devuelve como una STRING, ideal para leer ficheros de texto, sobre todo si estos se han creado mediante el comando FPUTS. El texto no debe medir más de 1024 caracteres. En dicha cadena se incluye el caracter 10 al final para indicar el fin de la linea, pero si se ha hecho con el bloc de notas de windows se añade además el caracter 13 (retorno de carro), es por eso que, a la hora de almacenar todo el texto, se suele tomar la cadena devuelta entera salvo los dos últimos caracteres (consultar el uso de SUBSTR).

Yo uso sin problemas las funciones FPUTS y FGETS sin problema alguno, siempre conjuntamente. No hago uso de FGETS para leer un archivo de texto sacado de vete a saber donde, no se si ese será tu problema.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

SplinterGU

En fenix puede tener problemas, te sugiero te pases a Bennu... por lo menos asi te podemos dar un soporte mas realista... saludos...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Bueno, yo he usado ficheros en Fenix sin ningun problema, ni siquiera el que se comenta de fgets.
Jejeje, esa documentación de FGETS me suena mucho :P Aunque creo que hay que hacer alguna modificación, porque en una de las últimas versiones creo recordar que terminó suprimiéndose el chr(10) de lo leido con fgets.

Y tengo que comprobar un detalle curioso de la 083b, a ver si se repite en las posteriores, que si uso substr en donde empieza un número, me toma los siguientes caracteres numéricos (por ejemplo, con substr(mi_cadena,10,10) me ha leido la cadena "328").
Son este tipo de cosas las que me hacen, cada día más, crearme mis propias funciones :P
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)

Windgate

Probablemente el problema es que usaba fgets(); en un fichero editado "a mano", sin fputs();

No problem, split(); me está dando buen resultado y seguiré usándolo.

Y lo de pasarme a Bennu definitivamente... Espera que lea un par de consultas que tengo hechas en el foro sobre Bennú y me lo pensaré, estoy en ello xD

Gracias!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Mas que crearte nuevas funciones lo que deberias hacer es reportar los errores para poder corregir el lenguaje...
Pero el modulo de strings fue revisado y corregido totalmente... por lo menos eso creo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: Windgate on October 22, 2008, 06:30:10 PM
Probablemente el problema es que usaba fgets(); en un fichero editado "a mano", sin fputs();

No problem, split(); me está dando buen resultado y seguiré usándolo.

Y lo de pasarme a Bennu definitivamente... Espera que lea un par de consultas que tengo hechas en el foro sobre Bennú y me lo pensaré, estoy en ello xD

Gracias!

No tiene importancia hacias editado el archivo a mano o no, mientras en cada linea le hayas dado enter...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Quote from: SplinterGU on October 22, 2008, 06:31:01 PM
Mas que crearte nuevas funciones lo que deberias hacer es reportar los errores para poder corregir el lenguaje...
Pero el modulo de strings fue revisado y corregido totalmente... por lo menos eso creo...

Es que creo que no es un error, es que funciona así (de hecho, creo recordar que C hace lo mismo) y creo que después dejó de trabajar de esa forma. No se, yo es que soy un maniático del control, y que una función use una "feature" que no está documentada me fastidia.
Pero no le des vueltas al asunto, aun era joven, no sabía lo que hacía, y hoy me va a tocar retocar el código de nuevo, y de paso, mejorarlo ;)
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)

Windgate

Estoy portando el juego a Bennu porque definitivamente fgets(); y split(); no me funcionan correctamente en Fenix (Meten un 0 en la cadena...).

El compilador de Bennu se me queja porque no conoce la función split(); ¿Qué librería debo incluír? Ahora mismo tengo estos define, copiados directamente de otro juego en Bennu:

#ifndef __VERSION__
//    import "bgdi";
    import "mod_sdlevthandler";
#else
    import "mod_say";
    import "mod_wm";
    import "libwm";
    import "mod_video";
    import "mod_map";
    import "libmouse";
    import "mod_text";
#endif

#ifdef COMPILER_VERSION
    import "mod_key";
    import "mod_string";
    import "mod_file";
    import "mod_mem";
    import "mod_proc";
    import "mod_time";
#endif
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

mod_regex

fijate que hay un archivo function-list.txt o algo asi... donde describe cada modulo y que funciones contiene...

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