Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: jokin666 en Octubre 17, 2014, 03:08:57 PM

Título: Leer varios strings de una misma linea de fichero .txt [SOLUCIONADO]
Publicado por: jokin666 en Octubre 17, 2014, 03:08:57 PM
Hola a todos.
Mi problema es que al usar file_text_read_string(file);  se lee toda la linea actual del txt, y me gustaria saber si se puede poner algun caracter o codigo para que solo lea parte de la linea.
No se si lo he explicado bien, asi que voy a poner un ejemplo de lo que quiero hacer :P

Primero tengo este txt:

1 768 192 0 Bate de Baseball
2 928 512 1 Llave Inglesa     
4 512 448 2 Espada             


El cual cargo con este codigo:
global.armas_cc=ds_grid_create(5,3);
file=file_text_open_read("armas_c_c.txt");
for (yy=0;yy<=2;yy+=1){
    for (xx=0;xx<=4;xx+=1){
        if xx==4 global.armas_cc[#xx,yy]=file_text_read_string(file);
        else global.armas_cc[#xx,yy]=file_text_read_real(file);
    }
    file_text_readln(file);
}


Hasta aqui todo perfecto, tengo todas las variables que quiero sin problemas.
Entonces, decidi añadir descripcion a las armas, y hay surge el problema. En cuanto el codigo llega al comando file_text_read_string lee todo lo que queda de linea y lo mete en la variable, no diferencia entre nombre y descripicon. He intentado separarlo con .,;..,," y todo lo que se me ha ocurrido..pero no funciona.
Ya se que una solucion seria poner el txt todo separado en lineas:

1
768
192
0
Bate de Baseball
2
928
512
1
Llave Inglesa

Pero no se..no me acaba de convencer, lo noto algo mas desordenado.

Asi que esa es la duda, si alguien conoce alguna forma de leer solo parte de una linea de .txt en vez de toda entera se lo agradeceria ;)
Título: Re:Leer varios strings de una misma linea de fichero .txt
Publicado por: ocarina en Octubre 17, 2014, 07:58:34 PM
Amigo esq el string no es solo para letras me explico el string va a leer tanto letras como números por eso es q te lee toda la linea
Mi consejo es que lo hagas condicionado osea
En lugar de poner bate de baseball pon en el evento step del objeto
If global.armas_cc==0
{
Nombre="bate de baseball"
}
Else if global.armas_cc==1
{
Nombre="llave inglesa"
}
Else if global.armas_cc==2
{
Nombre="espada"
}

Espero te sirva saludos
Título: Re:Leer varios strings de una misma linea de fichero .txt
Publicado por: Clamud en Octubre 17, 2014, 09:41:14 PM
Mira encontré éste script llamado "string_extract":
[gml]
/*
**  Usage:
**      string_extract(str,sep,index)
**
**  Arguments:
**      str         string of elements
**      sep         character or string seperating the elements
**      index       element to return, {0..n-1}
**
**  Returns:
**      the element at the given index within a given string of elements
**
**  Example:
**      string_extract("cat,dog,mouse",",",1) == "dog"
**
**  GMLscripts.com
*/
{
    var str,sep,ind,len;
    str = argument0;
    sep = argument1;
    ind = argument2;
    len = string_length(sep)-1;
    repeat (ind) str = string_delete(str,1,string_pos(sep,str)+len);
    str = string_delete(str,string_pos(sep,str),string_length(str));
    return str;
}
[/gml]
Primero obtienes una cadena con "file_text_read_string", después la pasas como argumento y extraes la parte que necesitas. Claro que con todo ese procedimiento es mucho más lento que usar solamente "file_text_read_string".
Título: Re:Leer varios strings de una misma linea de fichero .txt
Publicado por: penumbra en Octubre 17, 2014, 10:05:49 PM
Creo que la manera más óptima de hacer lo que quieres es usar las funciones de cadena de GML para ir leyendo los caracteres que componen toda la línea, usando a la vez ciclos para hacerlo recursivo.

Por ejemplo

[gml]
posicion = 0
palabra = ""
while(posicion < string_length(mi_cadena) )
{
     while (string_char_at(mi_cadena, posicion) != " ")
     {
          palabra += string_char_at(mi_cadena, posicion)
          posicion += 1
     }
     posicion += 1
     palabra = ""
}[/gml]
Esto haría que, mientras no se encuentre un espacio en blanco en la cadena, los caracteres (comenzando por el primero), se van guardando en la variable palabra. Usando tu ejemplo, se guardaría el 1, luego encontraría un espacio, por lo que se terminaría el ciclo anidado, luego se sumaría uno para saltar el espacio despées del 1 y el flujo volvería a entrar al ciclo anidado, entonces en las siguientes tres iteraciones leería 768, y volvería a salir del ciclo anidado al encontrarse con otro espacio, etc, etc.

El ejemplo es sólo para darte una idea, necesitaría elaborarse más para que detecte saltos de línea o para que guarde las palabras de una línea en un arreglo o ds_list, ds_map, etc. Obviamente que se pueden usar ciclos for o repeat en lugar del while
Título: Re:Leer varios strings de una misma linea de fichero .txt
Publicado por: jokin666 en Octubre 19, 2014, 01:47:34 PM
Pero que burro soy :-[
Yo comiendome la cabeza buscando algun comando relacionado con file_read o algun codigo ascii que marcara el final de lectura o algo parecido  para intentar solucionar el problema..y no se me ocurrio pensar que la solucion estaba en los comandos para modificar strings XD

Gracias a Clamud y a Penumbra por ayudarme a solucionar mi problema :D
Y Ocarina, aunque tu respuesta no me sirviera, te agradezco que intentaras ayudarme ;)

Por si a alguien le sirve de ayuda, dejare el codigo que he usado al final:

FICHERO TXT
1 768 192 0 1 Bate de Baseball;Para jugar y golpear
2 928 512 1 2 Llave Inglesa;Arregla o destroza
4 512 448 2 4 Espada;Muy afilada
etc..

CODIGO PARA PASAR EL TXT AL DS_GRID
global.armas_cc=ds_grid_create(7,3);
file=file_text_open_read("armas_c_c.txt");
for (yy=0;yy<=2;yy+=1){
    for (xx=0;xx<=5;xx+=1){
        if xx==5{
           palabras=scr_separa_texto(file_text_read_string(file));
           global.armas_cc[#5,yy]=palabras[0];
           global.armas_cc[#6,yy]=palabras[1];
        }else global.armas_cc[#xx,yy]=file_text_read_real(file);
    }
    file_text_readln(file);
}
file_text_close(file);

SCR_SEPARA_TEXTO
texto=argument0;
text[0]="";
text[1]="";

repeat (string_length(texto)){
    if string_char_at(texto,1)<>";"{
       text[0]+=string_char_at(texto,1);
       texto=string_delete(texto,1,1);
    }else{
       texto=string_delete(texto,1,1);
       text[1]=texto;
       break;   
    }     
}
if string_char_at(text[0],1)==" " text[0]=string_delete(text[0],1,1);
return text;