Problema con c++

Hola!! queria preguntar :) vereis estoy haciendo un programa ( una practica... ) y tengo un problema tengo que leer un fichero binario vale? . Se supone que la informacion se insertar en los ficheros mediante la siguiente estructura :

typedef struct {
   char autor[30] ;
   char album[30] ;
   char titulo[30] ;
   int valoracion ;
   char url[40] ;
   char imagen[50];
} TCancionBinaria ;



Vale el problema es que tengo que leer el fichero e insertar los datos de la estructura de arriba en esta otra estructura , la siguiente :

typedef struct {
   string cancion ;
   string album   ;
   string titulo  ;
   int valoracion  ;
   string url ;
   string autor ;
   string imagen ;
}tCancion ;


Esta es mi funcion :
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 ;
   }
}


Lo que hace esta funcion es leer del archivo binario ( teoricamente ) e inserta los datos en un array del tipo tCancion. El problema es que nose muy bien como hacerlo y me estoy haciendo un lio. Cuando leo del fichero no me inserta el autor que es el unico que he puesto por ahora. ¿Alguna solucion ?
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.
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.


Muchas gracias ^^^!!!!
2 respuestas