[Solucionado]Lista enlazada guardar y cargar datos

Iniciado por erickgracia, 6 Mayo 2014, 23:00 PM

0 Miembros y 1 Visitante están viendo este tema.

erickgracia

Hola, tengo un problema con una lista enlazada...lo que haria el programa  es guardar una lista de paises ademas de un ID para cada uno... basicamente al querer cargar los datos al abrir el archivo, pareciera que me da un loop o un error la funcion  "cargarPaises();" o mas bien una funcion  que esta adentro de ella que se llama "insertarPaisesG()" que lo que buscaria es que ingrese los datos de un .bat a la lista enlazada de acuerdo a los parametros que tenga la funcion.

aqui les dejo el codigo de las funciones especificas donde tengo el problema.


Estas seria la estrutura basica de la lista enlazada y sus punteros del principio y final

typedef struct paises{
int IDpais;
char Pais[20];
int NoParticipantes;
int NoMedallas;

struct paises* p;
} Paises;

Paises*PAIprimero=NULL;
Paises*PAIultimo=NULL;




estas serian las funciones con las que tendria problemas, agrego la funcion que usè para guardar los datos, que al parecer me sirvio, pero por si llega a ser el problema lo dejo (soy algo novato, asi que espero me perdonen algunas redundancias o errores de novato aqui  ;D )


void insertarPaisesG(int ID, char Nombre[]){
Paises * nuevo;
nuevo = (Paises *)malloc(sizeof(Paises));

nuevo->IDpais=ID;
strcpy(nuevo->Pais, Nombre);


if(PAIprimero->p!=PAIultimo){
PAIprimero=nuevo;
PAIprimero->p=PAIultimo;

}
else{
nuevo->p=NULL;
PAIultimo->p=nuevo;
PAIultimo=nuevo;
}

}







void guardarPaises(){
printf("\n\n\nGuardando informaci�n de paises");
FILE * archivo = fopen("Paises.dat", "wb");
if(archivo == NULL){
printf("\n\n\nError al guardar en archivo");
return;
}

Paises * recorre = PAIprimero;
while (recorre != NULL){
fwrite(recorre, sizeof(Paises), 1, archivo);
recorre = recorre->p;
}

fclose(archivo);
}








void cargarPaises(){
FILE * archivo = fopen("Paises.dat", "rb");
if(archivo == NULL){
printf("\n\n\nError al cargar desde archivo");
return;
}

Paises * actual = (Paises *) malloc(sizeof(Paises));
int leidos;
do{
leidos = fread(actual, sizeof(Paises), 1, archivo);
if (leidos == 1)
insertarPaisesG(actual->IDpais, actual->Pais);
} while (leidos == 1);

fclose(archivo);
}



de antemano gracias por la ayuda, y si se llegara a ocupar el codigo completo lo pondria mas adelante  ;D

eferion


void insertarPaisesG(int ID, char Nombre[]){
Paises * nuevo;
nuevo = (Paises *)malloc(sizeof(Paises));

nuevo->IDpais=ID;
strcpy(nuevo->Pais, Nombre);


if(PAIprimero->p!=PAIultimo){


Si acabas de arrancar el programa, asumo que no hay elementos en la lista, luego PAIprimero debería ser null... si esto es así, lo mejor que te puede pasar al hacer "PAIprimero->p" es que el programa se rompa.

Luego otro detalle:

fwrite(recorre, sizeof(Paises), 1, archivo);

Eres consciente de que ahí estás guardando el puntero al siguiente elemento... puntero que al cargar ya no será válido puesto que los elementos cargados se pondrán en posiciones diferentes de la memoria.

Para evitar este "acoplamiento" podrías adaptar un poco "struct paises" para poder separar la chicha de la lista enlazada:


typedef struct pais
{
int ID;
char Nombre[20];
int NoParticipantes;
int NoMedallas;
} Pais;

typedef struct nodo
{
  Pais pais;
  struct nodo* p;
} Nodo;


de esta forma, para componer la lista creas elementos de tipo "Nodo" y para guardar accedes únicamente al elemento nodo.pais:


void insertarPaisesG(int ID, char Nombre[]){
Nodo* nuevo;

        // Mejor calloc que malloc... calloc reinicia la memoria
        // asi los campos "NoParticipantes" y "NoMedallas" empezaran con valor 0 automaticamente.
nuevo = (Nodo*)calloc(1, sizeof(Nodo));

nuevo->pais.ID=ID;
strcpy(nuevo->pais.Nombre, Nombre);

// ...
}

void guardarPaises(){
printf("\n\n\nGuardando informaci�n de paises");
FILE * archivo = fopen("Paises.dat", "wb");
if(archivo == NULL){
printf("\n\n\nError al guardar en archivo");
return;
}

Nodo* recorre = PAIprimero;
while (recorre != NULL){
fwrite(&(recorre->pais), sizeof(Pais), 1, archivo); // Solo guardamos la "chicha"
recorre = recorre->p;
}

fclose(archivo);
}

void cargarPaises(){
FILE * archivo = fopen("Paises.dat", "rb");
if(archivo == NULL){
printf("\n\n\nError al cargar desde archivo");
return;
}

Pais pais; // No tiene sentido que uses malloc aqui... ademas se te olvido el free correspondiente
int leidos;
do{
leidos = fread(&(pais), sizeof(Pais), 1, archivo);
if (leidos == 1)
insertarPaisesG(pais.ID, pais.Nombre);
} while (leidos == 1);

fclose(archivo);
}

erickgracia

Gracias por la ayuda, ya me sirvio el programa, solo tuve que modificar el resto de la lista enlazada al metodo de las dos estructuras y ya estuvo  ;D