Ver la versión completa : Intento escribir en un fichero pero me falta algo... ayuda plis
JonGoten
06/07/2004, 00:22
Lo que quiero es crear un nuevo fichero (prueba.txt) y escribir una palabra (Hola).
El código fuente que tengo es el siguiente:
#include <gpstdio.h>
#include <gpstdlib.h>
#include <gpgraphic.h>
#include <gpfont.h>
GPDRAWSURFACE gpDraw;
int key_pressed, changed_key;
F_HANDLE fichero;
void GpMain(void *argv)
{
while (1)
{
GpLcdSurfaceGet(&gpDraw, 0);
GpTextOut(NULL,&gpDraw,10,10,(char*)"Pulsa START para crear y escribir un",0x0);
GpTextOut(NULL,&gpDraw,10,30,(char*)" fichero",0x0);
changed_key = GpKeyGetEx(&key_pressed);
if(key_pressed & changed_key & (GPC_VK_START))
{
GpFatInit();
GpFileCreate ("gp:\\gpmm\\prueba.txt",0,fichero);
GpFileOpen("gp:\\gpmm\\prueba.txt", OPEN_W, fichero);
GpFileWrite (fichero,"Hola", 1);
GpFileClose (fichero);
GpAppExit();
}
}
}
El programa crea el fichero pero no lo escribe. Además si saco la SMC y la meto en el PC, windows me dice que está dañado o es ilegible.
Espero que me podais ayudar y sacar así nuevas versiones de mis juegos...
Hola Jon, cuanto tiempo. Te persigo xD. A ver si un dia sacas un kamikaze q pueda guardar puntos. :rever:
Creo q x lo menos al crear el fichero tienes q pasar la direccion del handle pq sino no se donde se guarda.
prueba con esto:
GpFileCreate ("gp:\\gpmm\\prueba.txt",0,&fichero);
aparte de q como bien te han apuntado debes usar &fichero donde convenga, te indico que despues de GpFileCreate hagas un GpFileClose ya que el fichero queda abierto tras crearlo... este en concreto fue un bug del fMSX32 y fSMS32, que jodian las SMCs sin venir a cuento
un bug bastante jodido de encontrar :-)
saludos
Si quieres saber que está haciendo tu programa:
// Inicializas la FAT
GpFatInit();
// Creas el archivo prueba.txt solo si no existe y guardas su
// handle en la dirección de memória indeterminada contenida
// dentro de fichero.
// A partir de aquí el archivo ya está abierto. Pero no tienes su handle.
GpFileCreate ("gp:\\gpmm\\prueba.txt",0,fichero);
// Intentas abrir otra vez el archivo prueba.txt en escritura.
// Supongo que la función da error, pero como no la testeas
// pues no lo puedes saber. Aunque hubiera funcionado,
// sigues teniendo el mismo problema que antes con fichero.
GpFileOpen("gp:\\gpmm\\prueba.txt", OPEN_W, fichero);
// Intentas escribir 'H' y no 'Hola' en un archivo que tiene como handle el
// que está en fichero, o sea que no se sabe el handle que tiene.
// Seguro que la función te da error, pero como no la testeas
// pues no lo puedes saber.
GpFileWrite (fichero,"Hola", 1);
// Intentas cerrar el archivo que tiene como handle el
// que está en fichero, o sea que no se sabe el handle que tiene.
// Seguro que la función te da error, pero como no la testeas
// pues no lo puedes saber.
GpFileClose (fichero);
// Te largas a saco de la aplicación esperando que todo haya
// funcionado bien :)
GpAppExit();
Aquí tienes lo que haría yo:
// Inicializar la FAT, pero fuera del bucle, porque solo hay que hacerlo una vez
GpFatInit();
// Crear el archivo prueba.txt siempre y guardar su handle en fichero.
// A partir de aquí el archivo ya está abierto.
if (GpFileCreate ("gp:\\gpmm\\prueba.txt", ALWAYS_CREATE, &fichero) != SM_OK)
// Error al crear el archivo
;
else
{
// Escribir 'Hola' en el archivo
if (GpFileWrite(fichero,"Hola", strlen("Hola")) != SM_OK)
// Error al escribir en el archivo
;
// Cerrar el archivo
GpFileClose(fichero);
}
// Salir del bucle, GpAppExit() tendria que estar fuera del bucle (mucho más limpio)
break;
JonGoten
06/07/2004, 07:23
Muchas gracias a todos. Por asuntos sociales :rolleyes: no puedo probarlo ahora, pero en cuanto llegue a casa... :musico:
Veo que la gran cagada está en el handle :D
Karadan, espero tener una nueva versión prontito, a ver si esta semana. Eso si, tengo que pensar el modo de crear el fihero para que no se pueda editar y trucar la puntuación, que te veo venir :D :D
JonGoten
06/07/2004, 17:18
Bien, he conseguido escribir la palabra Hola en el fichero, leyendolo con el kreader del windups, porque windows me sigue diciendo que el fichero está dañado :?
Bien, cómo habria que hacer para guardar en una cadena de caracteres lo que pone en el fichero?
Gracias a todos :p
JonGoten
06/07/2004, 20:24
Lo que hago para intentar leer es lo siguiente (lo pongo sin ifs ni nada, para facilitar las cosas)
char cadena[];
if(key_pressed & changed_key & (GPC_VK_START))
{
GpFatInit();
GpFileCreate ("gp:\\gpmm\\prueba.txt", ALWAYS_CREATE, &fichero);
GpFileWrite(fichero,"Hola", strlen("Hola"));
GpFileClose (fichero);
GpFileOpen( "gp:\\gpmm\\prueba.txt", OPEN_R, &fichero);
GpFileRead ( fichero, 1, &cadena, 1);
}
GpTextOut(NULL,&gpDraw,80,80,(char*)cadena,0x0);
Qué estoy haciendo mal a la hora de leer del fichero?
A ver si me podeis ayudar, que queda poco ya para hacer lo que quiero...
(Siempre he sido un negado con los ficheros :miedo: )
JonGoten
08/07/2004, 18:11
Que alguien me eche una mano para poder leer del fichero anda, que estoy a un paso.... :(
La declaración de GpFilRead() es:
ERR_CODE GpFileRead(F_HANDLE h_file, void * p_buf, ulong buf_size, ulong * p_read_count);
Como pone en la documentación del SDK oficial, el segundo parámetro (p_buf ) es el búfer en donde quieres leer los datos. Tu lo has puesto en 3era posición.
El tercer parámetro buf_size , es el tamaño del búfer o la cantidad de octetos que quieres leer. Tu has puesto 1 (y en mal sitio), o sea que solo leerías un solo carácter.
El cuarto parámetro (p_read_count ) es una variable en la que quieres que te devuelva la cantidad de octetos realmente leídos por la función. En principio, después de ejecutar GpFileRead() , si p_read_count < buf_size , quiere decir que ya no quedan más datos por leer.
Tu has puesto 1, osea que le estás indicando que en la posición de memória 1 te ponga el resultado.
Tienes dos errores potencialmente peligrosos que podrían colgarte el programa.
Por cierto, te has olvidado de cerrar el archivo después de leerlo, muy mal, muy mal, no has aprendido de la lección anterior :cagonto:
A parte de eso, has declarado cadena como char cadena[];
O sea que has declarado la variable pero no has reservado ningún espacio de memoria. Esto no es Basic, esto es C en el que hay que indicar el tamaño de la cadena de caracteres.
Tenías que escribir:
ulong octetosLeidos;
char cadena[100+1]; // máximo se podran leer 100 caracteres a la vez
// ya que sabemos que las cadenas de caràcteres en C
// tienen que acabar en \0, que colocaremos nosotros mismos.
GpFileRead(fichero, cadena, 100, &octetosLeidos);
cadena[octetosLeidos] = '\0'; // finalizamos correctamente la cadena de caràcteres.
Conclusión:
Lee bien la documentación del SDK oficial, que ahí pone toda esta información (bueno lo del '\0' no lo pone, pero eso esta en la documentación del C). :rolleyes:
JonGoten
09/07/2004, 07:05
Mil gracias oankali, eres el rey, lo probaré en cuanto llegue a casa ;)
Lo de no cerrar el fichero.... se me fue la olla :miedo:
Y en lo de leer la documentación del SDK oficial, supongo que te refieres al pdf, que para mi es bastante lioso y no pone gran cosa (a parte del poco tiempo que tengo para dedicarme a programar la gp32 :( )
Conclusión: Muchas gracias :brindis:
JonGoten
09/07/2004, 13:37
oankali, eres un fiera tio. Muchas gracias.
Por fin he conseguido escribir y leer. Pongo aquí el código por si a alguien le es de ayuda:
// Declaraciones
GPDRAWSURFACE gpDraw;
int key_pressed, changed_key;
char cadena[100+1];
ulong octetosLeidos;
F_HANDLE *fichero;
// Código
changed_key = GpKeyGetEx(&key_pressed);
if(key_pressed & changed_key & (GPC_VK_START))
{
GpFatInit();
GpFileCreate ("gp:\\gpmm\\prueba.txt", ALWAYS_CREATE, &fichero);
GpFileWrite(fichero,"Hola", strlen("Hola"));
GpFileClose (fichero);
GpFileOpen("gp:\\gpmm\\prueba.txt", OPEN_R, &fichero);
GpFileRead(fichero, cadena, 100, &octetosLeidos);
cadena[octetosLeidos] = '\0';
GpTextOut(NULL,&gpDraw,100,100,(char*)cadena,0x0);
gm_sprintf(cadena, "%d", octetosLeidos);
GpTextOut(NULL,&gpDraw,100,130,(char*)cadena,0x0);
GpFileClose (fichero);
}
Muchas gracias de nuevo tio. Siempre tendré atravesados los ***** ficheros en c, c++, basic, asm, java...
:miedo:
p62mohef
09/07/2004, 14:24
no solo tu los tendras atravesados.... :)
diox como odio tener que abrir y cerrar ficheros!!!!! :miedo: :mad: :miedo:
cyberbask
09/07/2004, 14:25
los ficheros son tediosos en todos los lenguajes.
Abajo los ficheros :D :D
nooo¡¡¡¡ que son bien necesarios
:brindis:
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.