Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/06/2016, 09:41
pguti
 
Fecha de Ingreso: junio-2016
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Violación de segmento (`core' generado)

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.