Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/06/2016, 01:49
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Violación de segmento (`core' generado)

Código C++:
Ver original
  1. typedef struct{
  2.     int id;
  3.     string nombre;
  4.     int infnum;
  5.     vector<string> abrinfo;
  6.     vector<string> info;    
  7. }LFicha;

Estamos en C++, no en C, luego ese typedef sobra. Acostúmbrate a usar la sintaxis propia de C++ para conseguir código más legible (no solo para tí sino también para los demás.

El equivalente propio de C++ de la declaración anterior es esta (de hecho podrás comprobar que sustituyendo directamente una por otra el programa compila igual de bien):

Código C++:
Ver original
  1. struct LFicha{
  2.     int id;
  3.     string nombre;
  4.     int infnum;
  5.     vector<string> abrinfo;
  6.     vector<string> info;    
  7. };

Tu error:

Código C++:
Ver original
  1. db.read((char*)&dbficha, sizeof(LFicha))

En C puede ser razonable leer y escribir directamente una estructura accediendo a sus bytes pero en C++ eso no suele funcionar. La razón es que C++ usa clases y una clase puede tranquilamente hacer uso de memoria dinámica sin que tu te des cuenta.

En este caso las clases string y vector hacen uso de memoria dinámica. Es por ello que puedes almacenar una cadena todo lo larga que quieras en un string sin que el programa falle. Lo que sucede es que la clase string tiene un puntero. Simplificando la clase string podría quedar tal que:

Código C++:
Ver original
  1. class string
  2. {
  3.   private:
  4.     char* ptr;
  5.  
  6.   public:
  7.     // ...
  8. };

Si tu copias a nivel de bits lo que vas a almacenar es el contenido del puntero que no es más que una posición de memoria (32 bits) en vez de una cadena de texto. Al leer del fichero lo que haces es actualizar dicho puntero a la fuerza y claro, acaba apuntando a una dirección no válida.

En C++ el guardado binario de la información es más laborioso que en el caso de C ya que tienes que guardar elemento a elemento. O eso o te creas una estructura plana (sin clases) al más puro estilo C, copias los datos en dicha estructura y vuelcas sus bits al fichero:

Código C++:
Ver original
  1. struct FichaPlana
  2. {
  3.     int id;
  4.     char nombre[MAX_LENGTH];
  5.     int infnum;
  6.     char abrinfo[MAX_ITEMS][MAX_LENGTH];
  7.     char info[MAX_ITEMS][MAX_LENGTH];
  8. };
  9.  
  10. for(int x=0;x<database.size();x++)
  11. {
  12.   FichaPlana plana;
  13.   plana.id = database[x].id;
  14.   strcpy(plana.nombre, database[x].nombre);
  15.   // ...
  16.   db.write((char*)&plana, sizeof(plana));
  17. }

Y algo equivalente en la lectura.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.