Código C++:
Ver originaltypedef struct{
int id;
string nombre;
int infnum;
vector<string> abrinfo;
vector<string> info;
}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 originalstruct LFicha{
int id;
string nombre;
int infnum;
vector<string> abrinfo;
vector<string> info;
};
Tu error:
Código C++:
Ver originaldb.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 originalclass string
{
private:
char* ptr;
public:
// ...
};
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 originalstruct FichaPlana
{
int id;
char nombre[MAX_LENGTH];
int infnum;
char abrinfo[MAX_ITEMS][MAX_LENGTH];
char info[MAX_ITEMS][MAX_LENGTH];
};
for(int x=0;x<database.size();x++)
{
FichaPlana plana;
plana.id = database[x].id;
strcpy(plana.
nombre, database
[x
].
nombre); // ...
db.write((char*)&plana, sizeof(plana));
}
Y algo equivalente en la lectura.
Un saludo.