Página 1 de 1

Fichero Binario C/C++

Publicado: Sab Nov 20, 2004 8:43 pm
por Juvei
Ahora me toca preguntar un poko sobre fichero binario.

Despues de solucionar el tema de los punteros, ahora estoy inmerso con los fichero binarios.

En la aplicacion que estoy haciendo tengo que mandar los datos escritos por el usuario a un fichero binario, la cosa es que ya tengo hecho ese codigo y se que funciona. Pero la aplicacion tambien tiene que poder sacar los datos del fichero binario y volver a volcarlos a la estructura que estamos utilizando.

Y aqui surgen los problemas, compilo ejecuto le doi a la opcion de rescatar los datos y el programa se cierra. (El programa casca)

En cambio le hago un paso a paso con un punto de ruptura y el programa FUNCIONA y sin ningun problema.

¿Como puede ser que funcione de una forma y de otra no?

Utilizo el dev-cpp 4.9.9.0, pero no se si el problema tiene que ver con el compilador.

La cosa es que para saber donde casca el programa como con el paso a paso no lo encontraba utilizo los system("pause"). Y resulta que el programa se cierra en cuanto el programa lee el segundo bloque de bytes del fichero binario.

Para hacer todo esto lo que estoy utilizando es:

Código: Seleccionar todo

void CBiblioteca::rescatarfichero()
{
char *titulo=NULL;
char *autor=NULL;
char *editorial=NULL;
int tipo,tamat,tamaa,tamae,p,anno,numre;
long ref,numvol;
bool prestado;
FILE *fp=NULL;
fp=fopen("datos.dat","rb");

while (!feof(fp)) 
{
   
   tipo=0;
   fread(&tipo,sizeof(int),1,fp);              //tipo
   system("pause");  //<--------En cuanto pasa de aqui el programa se cierra
   if (tipo==1)
   {
   system("pause");//<-------------------A este punto no llega el programa

       fread(&ref,sizeof(long),1,fp);          //referencia
       system("pause");
       
       fread(&tamat,sizeof(int),1,fp);
       char cad[tamat];                        //titulo
       fread(cad,sizeof(char),tamat+1,fp);
       titulo=new char [tamat];
       strcpy(titulo,cad);
       
       
       fread(&tamaa,sizeof(int),1,fp);
       char cad1[tamaa];                       //autor
       fread(cad1,sizeof(char),tamaa+1,fp);
       autor=new char [tamaa];
       strcpy(autor,cad1);
       
       
       fread(&tamae,sizeof(int),1,fp);
       char cad2[tamae+1];                       //editorial
       fread(cad2,sizeof(char),tamae+1,fp);
       editorial=new char [tamae];
       strcpy(editorial,cad2);
       
       
       fread(&p,sizeof(int),1,fp);             //prestado
       
       if (p==1)
       prestado=true;
       else if (p==0)
       prestado=false;
   
   CFichaLibro *li=new CFichaLibro(ref,titulo,prestado,tipo,autor,editorial);
   titulo=NULL;
   autor=NULL;
   editorial=NULL;
   delete []titulo;
   delete []autor;
   delete []editorial;
   ref--;
   insertar(ref,li);
   li=NULL;
   delete []li;
   }
   else if (tipo==2)
   {
   
       fread(&ref,sizeof(long),1,fp);          //referencia
       
       fread(&tamat,sizeof(int),1,fp);
       char cad[tamat];                        //titulo
       fread(cad,sizeof(char),tamat+1,fp);
       titulo=new char [tamat];
       strcpy(titulo,cad);
       
       
       fread(&tamaa,sizeof(int),1,fp);
       char cad1[tamaa];                       //autor
       fread(cad1,sizeof(char),tamaa+1,fp);
       autor=new char [tamaa];
       strcpy(autor,cad1);
       
       
       fread(&tamae,sizeof(int),1,fp);
       char cad2[tamae+1];                       //editorial
       fread(cad2,sizeof(char),tamae+1,fp);
       editorial=new char [tamae];
       strcpy(editorial,cad2);
       
       
       fread(&p,sizeof(int),1,fp);             //prestado
       
       if (p==1)
       prestado=true;
       else if (p==0)
       prestado=false;
       
       fread(&numvol,sizeof(long),1,fp);             //num volumen
   
   CFichaVolumen *libv=new CFichaVolumen(ref,titulo,prestado,tipo,autor,editorial,numvol);
   titulo=NULL;
   autor=NULL;
   editorial=NULL;
   delete []titulo;
   delete []autor;
   delete []editorial;
   ref--;
   insertar(ref,libv);
   libv=NULL;
   delete []libv;
   }    
   else if (tipo==3)
   {
   fread(&ref,sizeof(long),1,fp);          //referencia
       
       fread(&tamat,sizeof(int),1,fp);
       char cad[tamat];                        //titulo
       fread(cad,sizeof(char),tamat+1,fp);
       titulo=new char [tamat];
       strcpy(titulo,cad);
   
   fread(&p,sizeof(int),1,fp);             //prestado
       
       if (p==1)
       prestado=true;
       else if (p==0)
       prestado=false;
       
   fread(&anno,sizeof(int),1,fp);             //año
       
   fread(&numre,sizeof(int),1,fp);             //num revista
   
   CFichaRevista *rev=new CFichaRevista(ref,titulo,prestado,tipo,anno,numre);
   titulo=NULL;
   delete []titulo;
   ref--;
   insertar(ref,rev);
   rev=NULL;
   delete []rev;
   }

}

fclose(fp);
}

La cosa es que no se por que falla, alguien me puede decir por que puede ser????