elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con error al grabar en disco C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con error al grabar en disco C++  (Leído 2,197 veces)
Dimebag94

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda con error al grabar en disco C++
« en: 17 Junio 2014, 18:00 pm »

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;
}


« Última modificación: 18 Junio 2014, 11:00 am por Eternal Idol » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con error al grabar en disco C++
« Respuesta #1 en: 18 Junio 2014, 08:26 am »

std::string es una clase que gestiona cadenas de caracteres... no es una cadena de caracteres. Internamente, la clase string utiliza un puntero para almacenar la cadena de caracteres. Si tu almacenas en el fichero las posiciones de memoria utilizadas por "Usuario" de forma literal, estarás guardando en el disco el valor del puntero, es decir, la posición de memoria a la que apunta. Al recuperar la información del disco, recuperas el valor de la posición de memoria... pero en esa memoria no vas a encontrar información útil... es basura.

Lo que tienes que hacer es guardar los strings uno a uno:

Código
  1. bool Usuario::grabarPuntaje()
  2. {
  3.    FILE *u;
  4.    u=fopen(RUTAPUNTAJES,"ab");
  5.    if(u==NULL)
  6.    {
  7.        cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
  8.        return false;
  9.    }
  10.    fwrite( cadena.c_str( ), cadena.size( ),1,u );
  11.    // falta guardar "nombre"
  12.    fclose(u);
  13.    return true;
  14. }

Para recuperar la información, tampoco puedes machacar la posición de memoria de la clase, tienes que recuperar cada valor uno a uno y actualizar las variables según proceda.

PD.: El mecanismo que has puesto en tu código únicamente funcionará si ninguna de las clases implicadas hace uso de memoria dinámica; en caso contrario tendrás errores de lo más variopintos.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
grabar un disco
Multimedia
jelsir 3 1,883 Último mensaje 25 Mayo 2005, 21:24 pm
por Songoku
grabar mp4 en disco
Multimedia
manuelduende 5 3,215 Último mensaje 6 Diciembre 2006, 01:17 am
por Songoku
Ayuda: Error al grabar mi mp3 en un dvd
Software
Dieg^S 0 2,883 Último mensaje 19 Diciembre 2006, 03:44 am
por Dieg^S
Problema al grabar un disco!!
Software
valdo_82 1 3,775 Último mensaje 8 Noviembre 2011, 06:16 am
por valdo_82
Error en el disco duro, ayuda
Hardware
mendighator 6 2,882 Último mensaje 24 Febrero 2013, 20:58 pm
por mendighator
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines