elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado]Lista enlazada guardar y cargar datos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado]Lista enlazada guardar y cargar datos  (Leído 11,941 veces)
erickgracia

Desconectado Desconectado

Mensajes: 17


Ver Perfil
[Solucionado]Lista enlazada guardar y cargar datos
« en: 6 Mayo 2014, 23:00 pm »

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
Código:
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 )
Código:

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


« Última modificación: 7 Mayo 2014, 18:35 pm por erickgracia » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Lista enlazada guardar y cargar datos
« Respuesta #1 en: 7 Mayo 2014, 09:20 am »

Código
  1. void insertarPaisesG(int ID, char Nombre[]){
  2. Paises * nuevo;
  3. nuevo = (Paises *)malloc(sizeof(Paises));
  4.  
  5. nuevo->IDpais=ID;
  6. strcpy(nuevo->Pais, Nombre);
  7.  
  8.  
  9. if(PAIprimero->p!=PAIultimo){
  10.  

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:

Código
  1. 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:

Código
  1. typedef struct pais
  2. {
  3. int ID;
  4. char Nombre[20];
  5. int NoParticipantes;
  6. int NoMedallas;
  7. } Pais;
  8.  
  9. typedef struct nodo
  10. {
  11.  Pais pais;
  12.  struct nodo* p;
  13. } Nodo;

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

Código
  1. void insertarPaisesG(int ID, char Nombre[]){
  2. Nodo* nuevo;
  3.  
  4.        // Mejor calloc que malloc... calloc reinicia la memoria
  5.        // asi los campos "NoParticipantes" y "NoMedallas" empezaran con valor 0 automaticamente.
  6. nuevo = (Nodo*)calloc(1, sizeof(Nodo));
  7.  
  8. nuevo->pais.ID=ID;
  9. strcpy(nuevo->pais.Nombre, Nombre);
  10.  
  11. // ...
  12. }
  13.  
  14. void guardarPaises(){
  15. printf("\n\n\nGuardando informaci�n de paises");
  16. FILE * archivo = fopen("Paises.dat", "wb");
  17. if(archivo == NULL){
  18. printf("\n\n\nError al guardar en archivo");
  19. return;
  20. }
  21.  
  22. Nodo* recorre = PAIprimero;
  23. while (recorre != NULL){
  24. fwrite(&(recorre->pais), sizeof(Pais), 1, archivo); // Solo guardamos la "chicha"
  25. recorre = recorre->p;
  26. }
  27.  
  28. fclose(archivo);
  29. }
  30.  
  31. void cargarPaises(){
  32. FILE * archivo = fopen("Paises.dat", "rb");
  33. if(archivo == NULL){
  34. printf("\n\n\nError al cargar desde archivo");
  35. return;
  36. }
  37.  
  38. Pais pais; // No tiene sentido que uses malloc aqui... ademas se te olvido el free correspondiente
  39. int leidos;
  40. do{
  41. leidos = fread(&(pais), sizeof(Pais), 1, archivo);
  42. if (leidos == 1)
  43. insertarPaisesG(pais.ID, pais.Nombre);
  44. } while (leidos == 1);
  45.  
  46. fclose(archivo);
  47. }


En línea

erickgracia

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Lista enlazada guardar y cargar datos
« Respuesta #2 en: 7 Mayo 2014, 18:34 pm »

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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Problema con lista enlazada en C (buffer de entrada) « 1 2 »
Programación C/C++
xassiz~ 12 10,973 Último mensaje 21 Febrero 2011, 22:22 pm
por xassiz~
Eliminar datos de lista enlazada
Programación C/C++
erickgracia 6 16,712 Último mensaje 16 Abril 2014, 00:04 am
por erickgracia
guardar datos Lista enlazada
Programación C/C++
erickgracia 1 3,856 Último mensaje 17 Abril 2014, 14:30 pm
por ivancea96
cargar de un fichero y pasarlo a una lista enlazada en C????
Programación C/C++
jessec01 1 2,440 Último mensaje 17 Octubre 2016, 05:31 am
por dato000
Guardar Lista Enlazada en Archivo Binario
Programación C/C++
mari2diaz 2 4,841 Último mensaje 4 Abril 2018, 05:42 am
por mari2diaz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines