Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mari2diaz en 4 Abril 2018, 00:34 am



Título: Guardar Lista Enlazada en Archivo Binario
Publicado por: mari2diaz en 4 Abril 2018, 00:34 am
Hola estoy comenzando con las listas, si alguien puede decirme caul es mi error el programa se me queda colgado en la funcion LeerDatosPersona y no encuentro el problema

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include "Funciones.h"
  6.  
  7. void InicioSecion();
  8. void RegistrarPersona();
  9.  
  10. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  11.  
  12. int main(int argc, char *argv[]) {
  13. int opcion = 0, repite = 1;
  14.  
  15. do{
  16.  
  17. Presentacion();
  18. Menu();
  19. LeerCadena(Linea, M);
  20. sscanf(Linea, "%d", &opcion);
  21.  
  22. switch(opcion){
  23. case 1:
  24. break;
  25. case 2:
  26. RegistrarPersona();
  27.    break;
  28. case 3:
  29.    break;
  30. case 4:
  31. repite = 0;
  32.    break;
  33. default:
  34.    printf("\n\tOpcion Incorrecta: PRECIONE (1, 2, 3, 4)");
  35. break;
  36. }
  37.  
  38. }while(repite);
  39.  
  40. return 0;
  41. }
  42.  
  43. void RegistrarPersona(){
  44. Persona *persona;
  45. int buscarCedula = 0, repite = 1;
  46. char respuesta[M];
  47.  
  48. do{
  49.  
  50. system ("cls");
  51. Presentacion();
  52. printf("\n\n\t\t\t    .:Registro de Usuario:.\n");
  53.  
  54. printf("\n\tCedula: ");
  55. LeerCadena(Linea, M);
  56. sscanf(Linea, "%d", &buscarCedula);
  57.  
  58. if(!ExistePersona(buscarCedula, persona)){
  59.  
  60. persona = LeerDatosPersona(buscarCedula);
  61.  
  62. if (primer == NULL) primer = persona;
  63. if (ultimo != NULL) ultimo->siguiente = persona;
  64.  
  65. ultimo = persona;
  66.  
  67. if (GuardarDatos(ultimo)){
  68. system ("cls");
  69. Presentacion();
  70. printf("\n\n\t\t\t    .:Usuario Registrado Satisfactoriamente:.\n");
  71. }else{
  72. system ("cls");
  73. Presentacion();
  74. printf("\n\n\t\t\t    .:ERROR:.\n");
  75. printf("\n\tIntentelo Mas tarde");
  76. }
  77.  
  78. }else{
  79. system ("cls");
  80. Presentacion();
  81. printf("\n\n\t\t\t    .:El Usuario %d ya EXISTE:.\n", buscarCedula);
  82.            printf("\n\tNo puede registrarse multiples veces\n");
  83. }
  84.  
  85. printf("\n\tDesea registrar otra persona? [S/N]: ");
  86. LeerCadena(respuesta, M);
  87.  
  88. if (!(strcmp(respuesta, "s") == 0 || strcmp(respuesta, "S") == 0)){
  89. repite = 0;
  90. }
  91.  
  92. }while(repite);
  93. }

Funciones.h

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void Presentacion(){
  6. printf("\n\t****");                                                                
  7. printf("\n\t****");
  8. }
  9.  
  10. void Menu(){
  11. printf("\n\n\t\t\t    .::.\n");
  12.    printf("\n\t\t[1]. Inicio de Sesion\n");
  13.    printf("\t\t[2]. Registro de Usuario\n");
  14.    printf("\t\t[3]. Administrador\n");
  15.    printf("\t\t[4]. Salir\n");
  16.    printf("\n\t\tIngrese su Opcion: [ ]\b\b");
  17. }
  18.  
  19. #define M 100
  20. char Linea[M];
  21.  
  22. typedef struct Persona{
  23. char nombre[M];
  24. char apellido[M];
  25. char correo[M];
  26. char password[M];
  27. long int telefono;
  28. int cedula;
  29. struct Persona *siguiente;
  30. }Persona;
  31.  
  32. Persona *primer = NULL;
  33. Persona *ultimo = NULL;
  34.  
  35. int LeerCadena(char *cadena, int n){
  36.    int i, c;
  37. c = getchar();
  38.  
  39.    if (c == EOF){
  40.        cadena[0] = '\0';
  41.        return 0;
  42.    }
  43.  
  44.    if (c == '\n'){
  45.        i = 0;
  46.    }else{
  47. cadena[0] = c;
  48.        i = 1;
  49.    }
  50.  
  51.    for (; i < n-1 && (c = getchar()) != EOF && c != '\n'; i++){
  52.        cadena[i] = c;
  53.    }
  54.  
  55.    cadena[i] = '\0';
  56.  
  57.    if (c != '\n' && c != EOF)
  58.        while ((c = getchar()) != '\n' && c != EOF);
  59.  
  60.    return 1;
  61. }
  62.  
  63. char ExistePersona(int buscarCedula, Persona *persona){
  64. FILE *archivo = fopen ("DATOS.dat", "rb");
  65. char existe;
  66.  
  67. if (archivo == NULL){
  68. existe = 0;
  69. }else{
  70. existe = 0;
  71.  
  72. fread (&(*persona), sizeof(persona), 1, archivo);
  73.  
  74. while(!feof(archivo)){
  75. if (persona->cedula == buscarCedula){
  76. existe = 1;
  77. break;
  78. }
  79.  
  80. fread (&(*persona), sizeof(persona), 1, archivo);
  81. }
  82.  
  83. fclose(archivo);
  84. }
  85.  
  86. return existe;
  87. }
  88.  
  89. Persona *LeerDatosPersona(int cedula){
  90. Persona *persona = (Persona*) malloc(sizeof(Persona));
  91.  
  92. if (persona != NULL){
  93.    persona->cedula = cedula;
  94.  
  95.    printf("\n\t\tPrimer Nombre: ");
  96.    LeerCadena(persona->apellido, M);
  97.  
  98.    printf("\n\t\tPrimer Apellido: ");
  99.    LeerCadena(persona->apellido, M);
  100.  
  101.    printf("\n\t\tCorreo: ");
  102.        LeerCadena(persona->correo, M);
  103.  
  104.    printf("\n\t\tContrasena: ");
  105.    LeerCadena(persona->password, M);
  106.  
  107.     printf("\n\t\tTelefono: ");
  108.     LeerCadena(Linea, M);
  109.     sscanf(Linea, "%d", persona->telefono);
  110.  
  111.     persona->siguiente = NULL;
  112.  
  113. }else{
  114. system ("cls");
  115. Presentacion();
  116. printf("\n\n\t\t\t    .:Memoria Insuficiente:.\n");
  117. }
  118.  
  119. return persona;
  120. }
  121.  
  122. char GuardarDatos(Persona *persona){
  123. char guardar;
  124.  
  125. FILE *archivo = fopen ("DATOS.dat", "ab");
  126.  
  127. if (archivo == NULL){
  128. guardar = 0;
  129. }else{
  130. fwrite (&(*persona), sizeof(persona), 1, archivo);
  131. guardar = 1;
  132.  
  133. fclose (archivo);
  134. }
  135.  
  136. return guardar;
  137. }


Título: Re: Guardar Lista Enlazada en Archivo Binario
Publicado por: Kenji-chan en 4 Abril 2018, 04:57 am
Linea 109 sscanf(Linea, "%d", persona->telefono);

te falto mandar por referencia la bariable

sscanf(Linea, "%d", &persona->telefono);



Título: Re: Guardar Lista Enlazada en Archivo Binario
Publicado por: mari2diaz en 4 Abril 2018, 05:42 am
gracias no vi eso