Fichero Binario C/C++
Publicado: Sab Nov 20, 2004 8:43 pm
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:
La cosa es que no se por que falla, alguien me puede decir por que puede ser????
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);
}