Guardar Lista Enlazada en Archivo Binario

Iniciado por mari2diaz, 4 Abril 2018, 00:34 AM

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

mari2diaz

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "Funciones.h"

void InicioSecion();
void RegistrarPersona();

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
int opcion = 0, repite = 1;

do{

Presentacion();
Menu();
LeerCadena(Linea, M);
sscanf(Linea, "%d", &opcion);

switch(opcion){
case 1:
break;
case 2:
RegistrarPersona();
    break;
case 3:
    break;
case 4:
repite = 0;
    break;
default:
    printf("\n\tOpcion Incorrecta: PRECIONE (1, 2, 3, 4)");
break;
}

}while(repite);

return 0;
}

void RegistrarPersona(){
Persona *persona;
int buscarCedula = 0, repite = 1;
char respuesta[M];

do{

system ("cls");
Presentacion();
printf("\n\n\t\t\t    .:Registro de Usuario:.\n");

printf("\n\tCedula: ");
LeerCadena(Linea, M);
sscanf(Linea, "%d", &buscarCedula);

if(!ExistePersona(buscarCedula, persona)){

persona = LeerDatosPersona(buscarCedula);

if (primer == NULL) primer = persona;
if (ultimo != NULL) ultimo->siguiente = persona;

ultimo = persona;

if (GuardarDatos(ultimo)){
system ("cls");
Presentacion();
printf("\n\n\t\t\t    .:Usuario Registrado Satisfactoriamente:.\n");
}else{
system ("cls");
Presentacion();
printf("\n\n\t\t\t    .:ERROR:.\n");
printf("\n\tIntentelo Mas tarde");
}

}else{
system ("cls");
Presentacion();
printf("\n\n\t\t\t    .:El Usuario %d ya EXISTE:.\n", buscarCedula);
            printf("\n\tNo puede registrarse multiples veces\n");
}

printf("\n\tDesea registrar otra persona? [S/N]: ");
LeerCadena(respuesta, M);

if (!(strcmp(respuesta, "s") == 0 || strcmp(respuesta, "S") == 0)){
repite = 0;
}

}while(repite);
}


Funciones.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Presentacion(){
printf("\n\t****");                                                                 
printf("\n\t****");
}

void Menu(){
printf("\n\n\t\t\t    .::.\n");
    printf("\n\t\t[1]. Inicio de Sesion\n");
    printf("\t\t[2]. Registro de Usuario\n");
    printf("\t\t[3]. Administrador\n");
    printf("\t\t[4]. Salir\n");
    printf("\n\t\tIngrese su Opcion: [ ]\b\b");
}

#define M 100
char Linea[M];

typedef struct Persona{
char nombre[M];
char apellido[M];
char correo[M];
char password[M];
long int telefono;
int cedula;
struct Persona *siguiente;
}Persona;

Persona *primer = NULL;
Persona *ultimo = NULL;

int LeerCadena(char *cadena, int n){
    int i, c;
c = getchar();

    if (c == EOF){
        cadena[0] = '\0';
        return 0;
    }

    if (c == '\n'){
        i = 0;
    }else{
cadena[0] = c;
        i = 1;
    }

    for (; i < n-1 && (c = getchar()) != EOF && c != '\n'; i++){
        cadena[i] = c;
    }

    cadena[i] = '\0';

    if (c != '\n' && c != EOF)
        while ((c = getchar()) != '\n' && c != EOF);

    return 1;
}

char ExistePersona(int buscarCedula, Persona *persona){
FILE *archivo = fopen ("DATOS.dat", "rb");
char existe;

if (archivo == NULL){
existe = 0;
}else{
existe = 0;

fread (&(*persona), sizeof(persona), 1, archivo);

while(!feof(archivo)){
if (persona->cedula == buscarCedula){
existe = 1;
break;
}

fread (&(*persona), sizeof(persona), 1, archivo);
}

fclose(archivo);
}

return existe;
}

Persona *LeerDatosPersona(int cedula){
Persona *persona = (Persona*) malloc(sizeof(Persona));

if (persona != NULL){
    persona->cedula = cedula;
   
    printf("\n\t\tPrimer Nombre: ");
    LeerCadena(persona->apellido, M);
   
    printf("\n\t\tPrimer Apellido: ");
    LeerCadena(persona->apellido, M);
   
    printf("\n\t\tCorreo: ");
        LeerCadena(persona->correo, M);
   
    printf("\n\t\tContrasena: ");
    LeerCadena(persona->password, M);
   
      printf("\n\t\tTelefono: ");
    LeerCadena(Linea, M);
    sscanf(Linea, "%d", persona->telefono);
   
    persona->siguiente = NULL;
   
}else{
system ("cls");
Presentacion();
printf("\n\n\t\t\t    .:Memoria Insuficiente:.\n");
}

return persona;
}

char GuardarDatos(Persona *persona){
char guardar;

FILE *archivo = fopen ("DATOS.dat", "ab");

if (archivo == NULL){
guardar = 0;
}else{
fwrite (&(*persona), sizeof(persona), 1, archivo);
guardar = 1;

fclose (archivo);
}

return guardar;
}

Kenji-chan

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

te falto mandar por referencia la bariable

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