[PSP]ayuda con lectura de fichero estruccturado

tengo un fichero estructurado como este:
Nubes
ms0:/media/fondo.bmp
Cielo
ms0:/media/fondo2.bmp
batalla
ms0:/media/fondo3.bmp

relajante
ms0:/media/sonido2.at3
sam
ms0:/media/sonido.at3

santhy
2
prog
ms0:/media/pers1.bmp
feliz
ms0:/media/pers2.bmp
saulot
2
PSP
ms0:/media/pers5.bmp
cansado
ms0:/media/pers3.bmp

Nubes
sam
santhy
Izquierda
prog
asdasd
saulot
Izquierda
PSP
asd
Cielo
santhy
Central
feliz
asdasd
saulot
Invisible
cansado
asd
relajante
santhy
Central
feliz
asdasd
Nubes
santhy
Izquierda
prog
asdasd
sam
santhy
Izquierda
prog
asdasd
saulot
Invisible
cansado
asd




al cargarlo con esta función:

void prepararGuion(char *fichero){
    animacion * ani;
    std::fstream f;
    char aux[4098];
    char * nombre;
    char *nombref;
    char *imagenf;
    char * posicion;
    char * dialogo;
    char *rutaAnimacion;
    char *nombreanimacion;
    char aux2[2];
    entradaGuion *eg;
    fondod * fondo;
        sonidof* snd2;
    sprintf(aux2,"");
    personaje * persona;

    int nanimaciones;

    f.open(fichero,std::fstream::in);
    f.getline(aux,1024,'\n');

    while(strcmp(aux,aux2)!=0){
       nombref=new char[1024];
       strcpy(nombref,aux);
       imagenf=new char[1024];
       f.getline(aux,1024,'\n');
       strcpy(imagenf,aux);
       f.getline(aux,1024,'\n');
       fondo=new fondod(nombref,imagenf);
       fondos.push_back(fondo);
    }
   
     f.getline(aux,1024,'\n');
   
    while(strcmp(aux,aux2)!=0){
       nombref=new char[1024];
       strcpy(nombref,aux);
       imagenf=new char[1024];
       f.getline(aux,1024,'\n');
       strcpy(imagenf,aux);
       f.getline(aux,1024,'\n');
       snd2=new sonidof(nombref,imagenf);
       sonidos.push_back(snd2);

    }
    f.getline(aux,1024,'\n');
    while (strcmp(aux,aux2)!=0){
     nombre=new char[1024];
     strcpy(nombre,aux);
     persona=new personaje(nombre);
     
     f.getline(aux,1024,'\n');
     nanimaciones= atoi(aux); 

     for(int s=0;s<nanimaciones;s++){
          f.getline(aux,1024,'\n');
          nombreanimacion=new char[1024];
          strcpy(nombreanimacion,aux);
          f.getline(aux,1024,'\n');
          rutaAnimacion=new char[1024];
          strcpy(rutaAnimacion,aux);
          ani=new animacion(nombreanimacion,rutaAnimacion);
          persona->animaciones.push_back(ani);
     }
     personas.push_back(persona);
     f.getline(aux,1024,'\n');

     
       }
      f.getline(aux,1024,'\n');
      while(strcmp(aux,aux2)!=0){
          int cambiarfondo=buscarFondo(aux);
          int cambiarsonido=buscarSonido(aux);
          if(buscarPersona(aux)>=0 && cambiarfondo<0 && cambiarsonido<0){
             
              nombre = new char[1024];
              strcpy(nombre, aux);
              f.getline(aux,1024,'\n');
              posicion=new char[1024];
              strcpy(posicion,aux);
              f.getline(aux,1024,'\n');
              nombreanimacion=new char[1024];
              strcpy(nombreanimacion,aux);
              f.getline(aux,4098,'\n');
              dialogo=new char[4098];
              strcpy(dialogo,aux);   
              eg= new entradaGuion(nombre,nombreanimacion,dialogo,posicion);   
              guion.push_back(eg);
          }
          if(cambiarfondo>=0){
              f.getline(aux,1024,'\n');
              cambiarsonido=buscarSonido(aux);
              if(cambiarsonido<0){
                  nombre = new char[1024];
                  strcpy(nombre, aux);
                  f.getline(aux,1024,'\n');
                  posicion=new char[1024];
                  strcpy(posicion,aux);
                  f.getline(aux,1024,'\n');
                  nombreanimacion=new char[1024];
                  strcpy(nombreanimacion,aux);
                  f.getline(aux,4098,'\n');
                  dialogo=new char[4098];
                  strcpy(dialogo,aux);   
                  eg= new entradaGuion(nombre,nombreanimacion,dialogo,posicion);   
                  eg->fondo=cambiarfondo;
                  guion.push_back(eg); //si lo pongo peta.. mágia?
              }
              else{
                   f.getline(aux,1024,'\n');
                  nombre = new char[1024];
                  strcpy(nombre, aux);
                  f.getline(aux,1024,'\n');
                  posicion=new char[1024];
                  strcpy(posicion,aux);
                  f.getline(aux,1024,'\n');
                  nombreanimacion=new char[1024];
                  strcpy(nombreanimacion,aux);
                  f.getline(aux,4098,'\n');
                  dialogo=new char[4098];
                  strcpy(dialogo,aux);   
                  eg= new entradaGuion(nombre,nombreanimacion,dialogo,posicion);   
                  eg->fondo=cambiarfondo;
                  eg->snd=cambiarsonido;
                  guion.push_back(eg);
              }
          }
          else{
          if(buscarSonido(aux)>=0){
                  f.getline(aux,1024,'\n');
                  nombre = new char[1024];
                  strcpy(nombre, aux);
                  f.getline(aux,1024,'\n');
                  posicion=new char[1024];
                  strcpy(posicion,aux);
                  f.getline(aux,1024,'\n');
                  nombreanimacion=new char[1024];
                  strcpy(nombreanimacion,aux);
                  f.getline(aux,4098,'\n');
                  dialogo=new char[4098];
                  strcpy(dialogo,aux);   
                  eg= new entradaGuion(nombre,nombreanimacion,dialogo,posicion);   
                  eg->snd=cambiarsonido;
                  guion.push_back(eg);     
          }
          }
     
          f.getline(aux,1024,'\n');
         
      }


}

a veces falla al leer el ultimo loop esta idea la tube a partir de ver que la idea naif no funcionaba que era leer nombre de personaje si el nombre es un fondo avanzo lectura, leer sonido si el nombre es un sonido avanzo lectura y por último si el nombre es un personaje leo la frase el nombre y la posición.

nada no va :(
Y el f.close()???? Se mas preciso en el fallo.
te puedo asegurar que el f.close no era, ya que este fichero solo se trata una vez, por lo tanto ese fallo no tiene sentido ( ya lo cerraré en la versión final).

pd: comprarme argo en mi tienda payo.
Bueno, yo no tengo mucha experiencia en programacion para PSP, peeero, kizas el problema este en q puede q estes declarando vectores demasiado grandes, pues por lo q he leido por ahi, la psp tiene unos recursos relativamente limitados. Sino mira a ver si se t ha ido la bola cuando gestionas las marcas de fin de ristra y tal.

Weno espero haber ayudado en algo ^^

un saludo...
por cierto el error q tengo parece ser una iolación d segmento...
Un consejo, todo este codigo lo puedes reducir a mucho menos con muy poco esfuerzo, lo cual te facilita depurarlo.
nombre = new char[1024]; lo tienes repetido hasta la saciedad



    char aux[4098]; //Si usas cuadrados de 2 deberia ser 4096

imagenf= new char[1024];
nombref= new char[1024];
nombreanimacion= new char[1024];
rutaAnimacion= new char[1024];
nombre=new char[1024];
posicion=new char[1024];
dialogo=new char [4098];

yo pondria esto en el inicio de la funcion y asi no estaria todo el rato ni escribiendo esa linea, ni la maquina redimensionandome cada vez el array. Prueba a cambiar ese valor 4098 por su correspondiente 4096 a ver si asi no tienes fallos, otra cosa yo ys no se decirte
PauSaDRaMaTiCa escribió:Un consejo, todo este codigo lo puedes reducir a mucho menos con muy poco esfuerzo, lo cual te facilita depurarlo.
nombre = new char[1024]; lo tienes repetido hasta la saciedad



    char aux[4098]; //Si usas cuadrados de 2 deberia ser 4096

imagenf= new char[1024];
nombref= new char[1024];
nombreanimacion= new char[1024];
rutaAnimacion= new char[1024];
nombre=new char[1024];
posicion=new char[1024];
dialogo=new char [4098];

yo pondria esto en el inicio de la funcion y asi no estaria todo el rato ni escribiendo esa linea, ni la maquina redimensionandome cada vez el array. Prueba a cambiar ese valor 4098 por su correspondiente 4096 a ver si asi no tienes fallos, otra cosa yo ys no se decirte


gracias por la respuesta, pero si te das cuenta esos new no son inutiles... estan hechos para reservar la memoria luego lo que hago es pasar esa dirección de memoria a una clase ( creo que se ve en el código ) bueno y si no creamos los news siempre estaríamos reescriviendo nombres y tal, para eso esta aux...

lo de usar potencias de 2 en realidad es una cosa simbolica ya que internamente no sé como lo arreglará la psp para hacerlo he cambiado el último while de la función por este:

      f.getline(aux,1024,'\n');
      while(strcmp(aux,aux2)!=0){
          int cambiarfondo=buscarFondo(aux);
          int cambiarsonido=buscarSonido(aux);
          if (cambiarfondo>=0){
              f.getline(aux,1024,'\n');
              cambiarsonido=buscarSonido(aux);
          }
          if( cambiarsonido>=0){
              f.getline(aux,1024,'\n');
          }
          nombre = new char[1024];
          strcpy(nombre, aux);
          f.getline(aux,1024,'\n');
          posicion=new char[1024];
          strcpy(posicion,aux);
          f.getline(aux,1024,'\n');
          nombreanimacion=new char[1024];
          strcpy(nombreanimacion,aux);
          f.getline(aux,4098,'\n');
          dialogo=new char[4098];
          strcpy(dialogo,aux);   
          eg= new entradaGuion(nombre,nombreanimacion,dialogo,posicion);   
          eg->fondo=cambiarfondo;
          eg->snd=cambiarsonido;
          guion.push_back(eg);

      }

debería hacer lo mismo que el anterior pero con este ni siquiera me carga si alguien puede ver el fallo?
6 respuestas