Poniendonos en situacion tengo un clase definida asi:
class cListaLineas
{
//por defecto privado
int _num; // numero de paradas almacenadas
int _numRuta; //numero de rutas
char _nomArchivo[100]; // nombre del archivo de paradas
cLinea *_pLista; // puntero a lista de paradas
[...]
con sus correspondientes metodos.
Y luego la clase cLinea es asi:
class cLinea
{
//Por defecto private
char _ID[10]; // identificador de linea.(p.e. L1)
char _descripcion [80]; //nombre asignado por AUVASA
unsigned short int _p_origen; //parada inicio de linea
unsigned short int _p_destino; //parada final de linea
unsigned short int * _ruta; //puntero a vector dinámico de IDs de parada
[...]
Antes,el constructor de la primera clase cListaLineas cargaba la lista en el vecto del archivo definido con el nombre de archivo. Pero lo que quiero hacer ahora es que cargue tambien la ruta de cada linea en su correspondiente puntero _ruta,no se si me explico. Por lo que necesito cargar cada elemento cLinea de _pLista por separado para hacer un sprintf() para formar el nombre del archivo de la ruta(que tiene que ser "../BaseDatos/%s.ruta" siendo %s la ID de la linea)
No se si me he explicado muy bien o como un libro cerrao...
Os pongo el constructor segun lo tengo:
Código:
cListaLineas::cListaLineas(char *nom_archivo) { int i; unsigned short int *ruta; char nom_ruta[30]; ifstream archivo; ifstream c_ruta; // Asigno el valor al atributo _nomArchivo strcpy(_nomArchivo, nom_archivo); // Compruebo existencia de archivo y nº de registros archivo.open(nom_archivo, ios::in | ios::binary); if(archivo.fail()) { // el archivo no existe cout << "El archivo" << nom_archivo << " no existe.\n"; // Inicializo los atributos a cero _num = 0; _numRuta = 0; this->_pLista = NULL; } else { archivo.seekg(0, ios::end); // Coloco el cursor al final del archivo _num = archivo.tellg()/sizeof(cLinea); // Tamaño en registros archivo.seekg(0, ios::beg); // Coloco el cursor al principio del archivo } if(_num){ cout << "Numero de lineas: " << _num << endl; // Creo un vector de _num registros de clase cLinea _pLista = (cLinea*) new cLinea[_num]; if(_pLista == NULL) { cout << "No hay memoria suficiente para la lista de " << endl; Pausa(); exit(0); } for(i = 0; i <_num; i++) { archivo.read((char*) _pLista[i],sizeof(cLinea)); /******ESTA ES LA LINEA QUE NECESITO CAMBIAR******/ sprintf(nom_ruta,"../BaseDatos/%s.ruta", _pLista[i].getID()); c_ruta.open(nom_ruta, ios::in | ios::binary); if(c_ruta.fail()) { cout << "El archivo no existe." << endl; _pLista[i].setRuta(NULL); } else { c_ruta.seekg(0, ios::end); // Coloco el cursor al final del archivo _numRuta = archivo.tellg()/sizeof(unsigned short int); // Tamaño en registros c_ruta.seekg(0, ios::beg); // Coloco el cursor al principio del archivo } if(_numRuta) { ruta = new unsigned short int [_numRuta]; c_ruta.read((char*) ruta,sizeof(unsigned short int)); _pLista[i].setRuta(ruta); delete [] ruta; } c_ruta.close(); } archivo.close(); } // fin if _num }
Bueno y ya que estamos en el destructor de la lista tambien quiero guardar uno por uno los elementos de _pLista para poder guardar tambien las rutas de cada linea por separado.El codigo del destructor es este,aun lo tengo para que guarde la lista de lineas de una vez:
Código:
cListaLineas::~cListaLineas() { ofstream archivo; // creo el objeto archivo archivo.open(this->_nomArchivo, ios::out | ios::binary); if(archivo.fail()) { cout << "Error al abrir archivo " << this->_nomArchivo << endl; exit(0); } archivo.write( (char*) _pLista, _num * sizeof(cLinea)); archivo.close(); // Libero la memoria asignada al vector dinámico delete [] _pLista; }
MUCHAS GRACIAS POR LA AYUDA!