Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/01/2009, 16:41
Kadhar
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Duda sobre cargar/guardar datos en C++

Bueno pues mi duda es la siguiente:

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!