Hola!!
Este es mi primer mensaje en el foro, les queria comentar que tengo un problema con C++ usando SDL. Estoy haciendo un juego en el que al final de una partida solicita las 3 iniciales y graba tus puntos en un archivo .DAT, para luego cuando se quiera entrar al menu de puntajes muestre los 5 mejores puntajes con sus respectivas iniciales. El problema esta en que luego de grabar el puntaje, si lo quiero leer hay una variable tipo String (que es la que muestra las 3 iniciales) que al hacer fread y guardarse en un objeto se vuelve loca y empieza a mostrar simbolos extraños en toda la consola.
Aqui estan las dos clases que manejan esto de los puntajes:
class Cadena
{
private:
string cadena;
SDL_Surface *nombre;
public:
Cadena();
~Cadena();
string getCadena() {return cadena;}
void tomarIngreso();
void Mostrar();
};
class Usuario
{
private:
Cadena nombre;
int puntos;
Tiempo juego;
int minutos,segundos,tiempoInicial;
bool nombreIngresado,gano;
public:
Usuario();
void mostrarNombre();
void procesarTiempoJuego();
void mostrarTiempoJuego();
void ingresarNombre();
void mostrarPuntos();
string getNombre() {nombre.getCadena();}
void setTiempoInicial(int t) {tiempoInicial+=t;}
int getTiempoRestante() {return tiempoInicial-juego.obtenerTiempo();}
int getPuntos() {return puntos;}
bool getGano() {return gano;}
bool getNombreIngresado() {return nombreIngresado;}
void setPuntos(int p) {puntos+=p;}
int leerPuntaje(int);
void pausarTiempoJuego() {juego.Pausar();}
void reanudarTiempoJuego() {juego.sacarPausa();}
bool grabarPuntaje();
};
Como veran la clase cadena esta dentro de las propiedades de la clase Usuario, la clase cadena es la que uso para escribir en pantalla las 3 iniciales y las guarda en un string para luego mostrarlas por pantalla en la clase Usuario. El problema llega cuando quiero hacer esto:
Usuario obj;
int pos=0;
while(obj.leerPuntaje(pos)==1)
{
cout<<obj.getPuntos()<<endl; --->ESTE ANDA BIEN
cout<<obj.getNombre()<<endl;---->ESTE ME MUESTRA SIMBOLOS EXTRAÑOS SIN PARAR Y MI PROGRAMA SE ROMPE
pos++
}
Si yo hago esto antes de grabarlo todo anda bien pero me da la sensacion de que el string no se esta grabando bien
Lo olvidaba aqui estan el leer y el grabar de la clase Usuario:
bool Usuario::grabarPuntaje()
{
FILE *u;
u=fopen(RUTAPUNTAJES,"ab");
if(u==NULL)
{
cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
return false;
}
fwrite(this,sizeof *this,1,u);
fclose(u);
return true;
}
int Usuario::leerPuntaje(int pos)
{
FILE *u;
u=fopen(RUTAPUNTAJES,"rb");
if(u==NULL)
{
cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
return 0;
}
int l;
fseek(u,pos*sizeof *this,0);
l=fread(this,sizeof *this,1,u);
return l;
}
Este es mi primer mensaje en el foro, les queria comentar que tengo un problema con C++ usando SDL. Estoy haciendo un juego en el que al final de una partida solicita las 3 iniciales y graba tus puntos en un archivo .DAT, para luego cuando se quiera entrar al menu de puntajes muestre los 5 mejores puntajes con sus respectivas iniciales. El problema esta en que luego de grabar el puntaje, si lo quiero leer hay una variable tipo String (que es la que muestra las 3 iniciales) que al hacer fread y guardarse en un objeto se vuelve loca y empieza a mostrar simbolos extraños en toda la consola.
Aqui estan las dos clases que manejan esto de los puntajes:
class Cadena
{
private:
string cadena;
SDL_Surface *nombre;
public:
Cadena();
~Cadena();
string getCadena() {return cadena;}
void tomarIngreso();
void Mostrar();
};
class Usuario
{
private:
Cadena nombre;
int puntos;
Tiempo juego;
int minutos,segundos,tiempoInicial;
bool nombreIngresado,gano;
public:
Usuario();
void mostrarNombre();
void procesarTiempoJuego();
void mostrarTiempoJuego();
void ingresarNombre();
void mostrarPuntos();
string getNombre() {nombre.getCadena();}
void setTiempoInicial(int t) {tiempoInicial+=t;}
int getTiempoRestante() {return tiempoInicial-juego.obtenerTiempo();}
int getPuntos() {return puntos;}
bool getGano() {return gano;}
bool getNombreIngresado() {return nombreIngresado;}
void setPuntos(int p) {puntos+=p;}
int leerPuntaje(int);
void pausarTiempoJuego() {juego.Pausar();}
void reanudarTiempoJuego() {juego.sacarPausa();}
bool grabarPuntaje();
};
Como veran la clase cadena esta dentro de las propiedades de la clase Usuario, la clase cadena es la que uso para escribir en pantalla las 3 iniciales y las guarda en un string para luego mostrarlas por pantalla en la clase Usuario. El problema llega cuando quiero hacer esto:
Usuario obj;
int pos=0;
while(obj.leerPuntaje(pos)==1)
{
cout<<obj.getPuntos()<<endl; --->ESTE ANDA BIEN
cout<<obj.getNombre()<<endl;---->ESTE ME MUESTRA SIMBOLOS EXTRAÑOS SIN PARAR Y MI PROGRAMA SE ROMPE
pos++
}
Si yo hago esto antes de grabarlo todo anda bien pero me da la sensacion de que el string no se esta grabando bien
Lo olvidaba aqui estan el leer y el grabar de la clase Usuario:
bool Usuario::grabarPuntaje()
{
FILE *u;
u=fopen(RUTAPUNTAJES,"ab");
if(u==NULL)
{
cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
return false;
}
fwrite(this,sizeof *this,1,u);
fclose(u);
return true;
}
int Usuario::leerPuntaje(int pos)
{
FILE *u;
u=fopen(RUTAPUNTAJES,"rb");
if(u==NULL)
{
cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
return 0;
}
int l;
fseek(u,pos*sizeof *this,0);
l=fread(this,sizeof *this,1,u);
return l;
}