Anuncios Google

escribir en archivo

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.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de best_guitar

hola,

estoy usando EFS, realmente tengo que utilizar la funcion fatInitDefault()?

 

Imagen de best_guitar

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!

Imagen de kNightFox

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.

 

Imagen de best_guitar

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!

Imagen de kNightFox

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 ^^.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.