Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda sobre cargar/guardar datos en C++

Estas en el tema de Duda sobre cargar/guardar datos en C++ en el foro de C/C++ en Foros del Web. Bueno pues mi duda es la siguiente: Poniendonos en situacion tengo un clase definida asi: class cListaLineas { //por defecto privado int _num; // numero ...
  #1 (permalink)  
Antiguo 13/01/2009, 16:41
 
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!
  #2 (permalink)  
Antiguo 13/01/2009, 18:35
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Duda sobre cargar/guardar datos en C++

Vale,ya me di cuenta de que con el read se puede leer uno a uno simplemente dejando sizeof(cLinea) y lo que sobra en la linea esa es el "[i]" de _pLista! He probado haciendolo asi y la primera linea la toma bien y carga su ruta,luego la i aumenta en uno,pero esto no afecta a la carga de la segunda linea,por lo tanto se carga bien,el problema es que cuando va a tomar el valor de la ID
Código:
sprintf(nom_ruta,"../BaseDatos/%s.ruta", _pLista[i].getID());
la i se vuelve loca y toma un valor negativo y raro(-823562647,por ejemplo) como si hubiera habido un desbordamiento de bufer.Lo que hace que el nombre del archivo de ruta no se guarde bien y por tanto no encuentre el archivo para abrirlo.
Alguien sabe porque ocurre?
Gracias.

EDITO:
Cambio el nombre que almacena la variable manualmente y le asigno el que deberia tener y aun asi me da un error de ejecucion

Última edición por Kadhar; 13/01/2009 a las 18:51
  #3 (permalink)  
Antiguo 14/01/2009, 02:47
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Duda sobre cargar/guardar datos en C++

Depuralo, tenes el codigo completo y nosotros no.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 14/01/2009, 10:23
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Duda sobre cargar/guardar datos en C++

Mira,lo depuro linea por linea,y la primera vuelta del bucle va todo perfecto,pero en la segunda vuelta justo al cambiar de la linea del sprintf para la siguiente la i pasa de valer 1 a valer -842150451,no entiendo porque pasa esto.

EDITO:

Que tonto estoy,con lo facil que era y yo complicandome la vida!si pongo el read fuera del bucle para que me lea el archivo completo ya no necesito ir leyendo uno a uno y ademas puedo cargar igualmente los archivos de rutas!
Gracias por escuchar. ;)
Ai vuelvo a tener dudas recurrire aqui de nuevo para ver si se solucionan igual de facil! :D

Última edición por Kadhar; 14/01/2009 a las 10:34
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:28.