Buenas tardes,
Bueno pues estoy intentando hacer en un programa en C++, que con una opcion guarde una copia de las fichas que tengo y con otra lo pueda cargar (para que no se me borren una vez cierre y abra)
Para esto estoy utilizando ficheros binarios (ifstream y ofstream) y pues al hacer el db.read me da el error: Violación de segmento (`core' generado)
He intentado de todo y sigo sin saber qué pasa. Sé que es por los strings (al asignarles un valor), pero si los quito se hace todo el bucle, llega al final del módulo y me da el mismo error. Si abro sin cargar la db no pasa nada, funciona bien.
Código:
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
typedef struct{
int id;
string nombre;
vector<string> abrinfo;
vector<string> info;
}TFicha;
vector<TFicha> database;
Módulo de cargar la db:
Código:
typedef struct{
int id;
string nombre;
int infnum;
vector<string> abrinfo;
vector<string> info;
}LFicha;
bool stop=false;
string name="database";
int cnt=0;
int temp=-1;
LFicha dbficha;
TFicha newficha;
ifstream db(name.c_str(), ios::binary);
if(db.is_open()){
while( db.read((char*)&dbficha, sizeof(LFicha)) && stop==false){
newficha.id=dbficha.id;
newficha.nombre=dbficha.nombre;
cout << "ID: " << newficha.id << " temp: " << temp << endl;
for(int i=0;i<dbficha.infnum;i++){
newficha.abrinfo.push_back(dbficha.abrinfo[i]);
newficha.info.push_back(dbficha.info[i]);
}
if(temp==newficha.id){
stop=true;
}
if(stop==false){
database.push_back(newficha);
newficha.abrinfo.clear();
newficha.info.clear();
temp=dbficha.id;
cnt++;
}
}
cout << endl << "DATABASE: Se han leido con exito " << cnt << " fichas."<< endl;
}else{
cout << endl << "DATABASE: No se ha podido encontrar el archivo, revise el fichero"<<endl;
}
db.close();
Módulo para guardar la db:
Código:
typedef struct{
int id;
string nombre;
int infnum;
vector<string> abrinfo;
vector<string> info;
}SFicha;
SFicha tosave;
string name="database";
int cnt=0;
char confirm='n';
cout <<endl<< "DATABASE: Estas seguro de que deseas sobreescribir todo? (y/n): ";
cin >> confirm;
if(confirm=='y'){
ofstream db(name.c_str(), ios::binary);
if(db.is_open()){
for(int x=0;x<database.size();x++){
tosave.id= database[x].id;
cout << "Save id: " <<tosave.id<<endl;
tosave.nombre= database[x].nombre;
cout << "Save name: "<< tosave.nombre<<endl;
tosave.infnum= database[x].info.size();
for(int i=0;i<tosave.infnum;i++){
tosave.abrinfo.push_back(database[x].abrinfo[i]);
tosave.info.push_back(database[x].info[i]);
}
db.write((char*)&tosave, sizeof(SFicha));
cnt++;
}
}else{
cout << endl << "DATABASE: No se ha podido encontrar el archivo, revise el fichero"<<endl;
}
db.close();
cout << "DATABASE: Se han guardado "<<cnt<<" fichas.";
}
Muchas gracias y saludos.