› Foros › PC › Software libre
typedef struct {
char autor[30] ;
char album[30] ;
char titulo[30] ;
int valoracion ;
char url[40] ;
char imagen[50];
} TCancionBinaria ;
typedef struct {
string cancion ;
string album ;
string titulo ;
int valoracion ;
string url ;
string autor ;
string imagen ;
}tCancion ;
void LeerFicheroBinario ( tCancion canciones[],int& cancion , string argumento)
{
TCancionBinaria aux ;
ifstream in ;
in.open(argumento.c_str(),ios::in | ios::binary);
bool error = false ;
if ( in.is_open() )
{
in.read ( (char*)&aux, sizeof(aux));
while (!in.eof() && !error && cancion!=maximo)
{
strncpy(canciones[cancion].autor,aux.autor,TAMBIN-1);
in.read ( (char*)&aux, sizeof(aux));
aux.autor[TAMBIN-1]='\0' ;
cancion++ ;
}
in.close();
}
else
{
cout << E5 << " " << argumento << endl ;
}
}
//Cabecera de la imagen
struct BitmapFileHeader{
Byte signature[2]; //Firma de dos bytes. Debe ser "BM"
Byte size[4]; //Tamaño en bytes de la imagen.
Byte reserved[4]; //Parte reservada. Debe estar siempre a 0
Byte data_offset[4]; //Offset desde el principio del archivo hasta la parte de los datos
};
//Abrimos la imagen en modo binario y en modo lectura
FILE *file;
file = fopen(fichero.c_str(),"rb");
if(file == NULL) Error::Throw(IMAGE_NOT_FOUND);
//Leeos y almacenamos el BitmapFileHeader
fread(BFH.signature,sizeof(Byte),2,file);
fread(BFH.size,sizeof(Byte),4,file);
fread(BFH.reserved,sizeof(Byte),4,file);
fread(BFH.data_offset,sizeof(Byte),4,file);
ifstream file("archivo.bin");
file>>tcancion.autor;
file>>tcancion.album;
file>>tcancion.titulo;
file>>tcancion.valoracion;
etc...
Korso10 escribió:No se si te exigen que utilizes ifstream, y aun así creo que tiene un metodo read. Yo para leer binarios hago el struct y luego uso fread. Te pongo un ejemplo://Cabecera de la imagen
struct BitmapFileHeader{
Byte signature[2]; //Firma de dos bytes. Debe ser "BM"
Byte size[4]; //Tamaño en bytes de la imagen.
Byte reserved[4]; //Parte reservada. Debe estar siempre a 0
Byte data_offset[4]; //Offset desde el principio del archivo hasta la parte de los datos
};
Este es un struct para almacenar la cabecera de una imagen en bmp//Abrimos la imagen en modo binario y en modo lectura
FILE *file;
file = fopen(fichero.c_str(),"rb");
if(file == NULL) Error::Throw(IMAGE_NOT_FOUND);
//Leeos y almacenamos el BitmapFileHeader
fread(BFH.signature,sizeof(Byte),2,file);
fread(BFH.size,sizeof(Byte),4,file);
fread(BFH.reserved,sizeof(Byte),4,file);
fread(BFH.data_offset,sizeof(Byte),4,file);
Lo que hago es crear un puntero al archivo y luego lo abro con fopen en modo binario. Para leer y almacenar los datos en el struct utilizo la funcion fread(destino,tamaño,numero_elementos,archivo). Si quiero leer la variable signature (2bytes), pongo fread(BFH.signature, sizeof(Byte), 2, file);
donde BFH.signature es el array donde quiero guardar los bytes, sizeof(Byte) es el tamaño de cada elemento (1byte), 2 es el numero de elementos que quiero leer, y file es el puntero al archivo.
Este codigo no funciona si usas streams de C++, pero creo que existe un metodo read, que debe tener unos parametros similares a fread.
De todas maneras creo que visto lo que quieres leer podrias intentar una forma más facil. Prueba algo como:ifstream file("archivo.bin");
file>>tcancion.autor;
file>>tcancion.album;
file>>tcancion.titulo;
file>>tcancion.valoracion;
etc...
en principio debería funcionar.