PDA

Ver la versión completa : Ayuda en un codigo para leer .txts



Hokutoy
24/02/2006, 23:18
Buenas!

Estoy haciendo un juego tipo QUIZ o TRIVIAL para Gp2x en FENIX y me encuentro el siguiente problema.
Cuando ejecuto el juego funciona muy bien pero al poco rato me salta al menú principal sin motivo aparente.
Después de debugearlo mucho, cambiando varias veces el codigo, de darle la lata a Puck para ver si era cosa del port (que va a ser que no porque en Gp32 pasa lo mismo), y de hacer mil pruebas he llegado a la conclusión de que lo que hace fallar al juego es el sigüiente Snippet de Racemaniac que he incluido en mi juego para poder leer las "preguntas" de mi juego desde un .txt externo y así cualquiera podrá incluir mas preguntas o editarlas a su gusto.
El problema es mi desconocimiento sobre como actua este codigo (sorry mi conocimiento de Fenix es limitado) por lo que no se si el uso reiterado de la funcion readfile("newdoc.txt"); puede llenar la memoria de alguna manera haciendo que el juego pete en la GP2x (En el Pc no peta). Alguna idea?
Alguien inspirado me puede decir de otra forma para conseguir leer y representar en pantalla un texto que se encuentre en un .txt adjunto?

Gracias!

Os dejo en codigo + ejemplo del Readfile:



program textreader;
global
power[4]=1,256,256*256,256*256*256;
textfile[1000];//we'll read up to 4000 chars
string line[100];//up to 100 lines, should be enough?
private
i;
begin
readfile("newdoc.txt");
for(i=0;i<10;i++)
write_string(0,160,5+i*10,4,&line[i]);
end
loop
frame;
end
end;
function readfile(string filename)
private
string chars[100];//up to 98 chars on a line (last two are for end of line)
lasttwo[2];
lastj;
j;
i;
begin
load(filename,textfile);
while(j<4000)
lasttwo[0]= (textfile[j/4]/power[j%4])%256;
chars[j-lastj]=chr(lasttwo[0]);
j++;
lasttwo[1]= (textfile[j/4]/power[j%4])%256;
chars[j-lastj]=chr(lasttwo[1]);
while((lasttwo[1]!=10 or lasttwo[0]!=13)and j<4000 and j-lastj<100);
j++;
lasttwo[0]=lasttwo[1];
lasttwo[1]= (textfile[j/4]/power[j%4])%256;
chars[j-lastj]=chr(lasttwo[1]);
end;
j++;
if(j-lastj==101);
return;
end
line[i++]=join("",&chars,j-lastj-2);
lastj=j;
end
return;
end;

Jhonnystorm
25/02/2006, 04:30
siento no poder ayudarte hokutoy, mis conocimientos de fenix no son tan extensos, aunque siempre puedes guardar los archivos en dat y cargarlos como strings, pero para que la gente lo utilizara necesitarias crear un conversor de textos a dat, y cargarlos en tu programa, es una idea.

Drumpi
25/02/2006, 06:13
Uf, cada vez que veo usar las funciones load y save me da un escalofrio...
El caso es que esas funciones no trabajan muy bien con datos complejos, en este caso, un array de 1000 posiciones. Puede que vaya bien y lo que falle sea que lees fuera del array (no estoy ahora para analizar mucho el codigo, pero si veo que reservas 1000 posiciones y dices que vas a leer hasta 4000)

Mi consejo es que uses las funciones fopen y fclose para abrir y cerrar el fichero, y que uses fgets para leer una linea entera y guardarla en un string, y si quiees moverte de una linea a otra, con fseek puedes mover el "puntero de lectura" al comienzo del archivo y/o ir avanzando con diversas llamadas a fgets.
Lo mejor es que a pesar de todo puedes usar el bloc de notas de windows para crear tus archivos, siempre que tras leer una linea elimines los dos ultimos caracteres (chr(13) y chr(10), fin de linea y retorno de carro) usando substr, por ejemplo:

linea_leida=substr(linea_leida,0,-2);

El problema es que los sets de caracteres no son los mismos, y las letras con tilde, la ñ y demas caracteres "extraños" (del 126 al 255, creo) no se representan correctamente.
Otra cosa, creo que linux, en sus archivos de texto omiten el chr(13) (salto de linea), por lo que solo debes eliminar un caracter.

Bueno, con esto ya tienes para investigar un rato, tal como tuve que hacer yo (¿te suena Venturer?)