vaya problema, llevo un monton de horas y parece que no se escribir en un archivo.
el problema lo tengo al escribir en la tabla de records del juego. lo tengo en un archivo de texto sin criptar con este formato.
records
-------------------
aaaa 20000
bbbb 18000
cccc 16000
...
el nombre (aaaa,bbbb,ccccc) puede constar de 15 caracteres como mucho lo demas son caracteres blancos hasta 15, tres espacios en blanco mas y cinco caracteres para la puntuacion.
int grabaRecords(FILE *file,char *nombre, int puntos){ char nombreArchivo[15]="records.txt"; char nom[18]=" "; //el nombre del jugador tendra como mucho 15 caracteres mas 3 de espacio int i=0; char cadena[32]=""; //guardará la linea a leer o escribir char puntuacionLinea[5]=""; //puntuacion en caracteres long int auxPosCursor=0; while((i<18)&&(nombre[i]!='\0')){ //copia el nombre pasado a una cadena de 18 caracteres(nom) nom[i]=nombre[i]; i++; } //PA_OutputText(PANT_INF,4,10,"%s1",nom); // char path_raw [EFS_MAXPATHLEN]; // sprintf (path_raw, "%s", nombreArchivo); file=fopen(nombreArchivo,"r"); //lee del archivo records. He probado con modo rw, rw+, pero nada... int posicionRecord=0; //en principio la posicion a escribir es cero if(file!=NULL){ //si abre archivo... for(int i=0;i<8;i++){ //para todas las lineas del archivo if(posicionRecord==0){ //si todavia no ha encontrado la linea donde se debe escribir... fgets(cadena,32,file); //obtiene linea de texto del archivo for(int j=0;j<6;j++){ //lee los 5 caracteres de la puntuacion puntuacionLinea[j] = cadena[j+17];//copia la puntuacion en caracteres } int iPuntuacion=atoi(puntuacionLinea); //convierte a entero if((iPuntuacion>0)&&(puntos>iPuntuacion)){ //si la nueva puntuacion es mayor que la puntuacion escrita en el archivo posicionRecord=i; //almacena la posicion donde debe escribir PA_OutputText(PANT_INF,0,9,"%s",cadena); PA_OutputText(PANT_INF,0,10,"posRecor %d punt %d puntcad %s",posicionRecord,iPuntuacion,puntuacionLinea); } } } if(posicionRecord>0){ sprintf(cadena,"%s%d",nom,puntos); //se genera la cadena con el nombre y el nuevo record PA_OutputText(PANT_INF,0,11,"%s",cadena); rewind(file); //rebobina el archivo int pos=0; //posicion del cursor int linea=1; //linea donde esta ubicado el cursor bool escrito=false; //boleano para comprobar la escritura while(!feof(file)){ //mientras no se llega a final de archivo if(fgetc(file)=='\n') //a cada final de linea suma una linea++; pos++; //suma un nuevo caracter if((!escrito)&&(linea == posicionRecord)){ PA_OutputText(PANT_INF,0,14,"%d %d",linea,pos); //rewind(file); auxPosCursor=ftell(file); //dice donde esta el cursor. LA POSICION ES CORRECTA //PA_OutputText(PANT_INF,0,15,"%d",auxPosCursor); //fprintf(file,"%s",cadena); //HABIA PROBADO DE ESCRIBIR CON rw pero nada escrito=true; } } } } else{ PA_OutputSimpleText(PANT_SUP,5,1,"FALLO CARGANDO ARCHIVO"); return NULL; } fclose(file); //cierra archivo para lectura file=fopen(nombreArchivo,"w"); //abre archivo para escritura rewind(file); //rebobina posicion del cursor fseek(file,auxPosCursor,SEEK_SET); //coloca el cursor en la posicion correcta fprintf(file,"%s",cadena); //no escribe!!!! fclose(file); return 1; }
hago todo el algoritmo correctamente, sin depurar mucho el codigo es verdad, pero, voy comprobando con la lectura de variables con PA_OutputText y todo es correcto hasta llegar al fprintf, el cual no me escribe en el archivo, no se porque. Podeis echar un ojo al codigo, a ver si veis algun fallo para escribir en el archivo. Vaya, para escribir en un archivo hace falta el modo w en fopen, ¿no? o me equivoco en algo... yo creo que el fallo esta en el fprintf pero no se que pasa. Ah! tengo activado EFS.
Saludos!
EDITO: estoy probando el programa sobre el nogba, no directamente sobre la nds.
hola,
estoy usando EFS, realmente tengo que utilizar la funcion fatInitDefault()?
tienes razon,
según he encontrado en la web, en esta direccion: http://www.elotrolado.net/hilo_escritura-de-ficheros-el-cuento-de-nunca-... no es posible escribir en un archivo utilizando un emulador. A ver si los reyes me pasan una nds, aunque no me he portado muy bien... nose.
En fin, seguiré con el juego confiando que realmente se está escribiendo en el archivo. en la version final, alguien me dirá si trabaja correctamente.
Saludos!
Visita mi blog. Zenit + 5 will win
Poder se puede, lo unico que
Poder se puede, lo unico que debes de añadir en el compiling time un archivo vacio con el tamaño maximo que desees usar. La otra opcion es iniciar las efs, y cambiar a fat con chdir("fat:/"); grabar o leer el archivo y volver a efs con chdir("efs:/");
Nuestra web oficial:
http://www.nightfoxandco.com/
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.
hola, gracias por la respuesta
no entiendo muy bien a que te refieres, ¿el archivo vacio debe añadirse en el directorio efsroot? (todavia uso palib), ¿se debe modificar algo en el makefile? Realmente hace poco que uso palib y en el tutorial en palib.info, decia que la utilizacion de FAT estaba desfasada y que aprendieramos EFS. De todas maneras buscaré más información. Por cierto, ¿que ha pasado en palib.info? hace dias que no puedo entrar...
Saludos!
Visita mi blog. Zenit + 5 will win
Ya te aseguro yo que estan
Ya te aseguro yo que estan mas desfasadas las EFS (que hace meses que no se actualizan) que las libfat, que se actualizan a cada release de las libnds.
Nuestra web oficial:
http://www.nightfoxandco.com/
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.
Ni idea, pero al menos los
Ni idea, pero al menos los tutoriales se pueden seguir viendo ^^.