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:
Módulo de cargar la db:#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;
Código:
Módulo para guardar la db: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();
Código:
Muchas gracias y saludos. 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."; }