I'm doing a file practice with a Person list that has a name and age. My problem is that when I run for the first time I can register and read in the file, but when I close and run again and I want to read the records again, the program crashes, that is, the .exe has stopped working.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define ARCHIVE_PERSONS "persons.bin"
typedef struct Person
{
int age;
char *name;
struct Person *next;
}Person;
void pause(){
printf("Presiona cualquier tecla para continuar\n");
getch();
}
void savePerson(Person *newPerson){
FILE * file;
file=fopen(ARCHIVE_PERSONS,"ab");
if(!file){
printf("No se ha podido abrir el archivo\n");
pause();
exit(1);
}
else
fwrite(
newPerson,sizeof(Person),1,file);
fclose(file);
}
Person * createPerson(int age, char * name){
Person *newPerson;
newPerson=(Person*)malloc(sizeof(Person));
if(!newPerson){
printf("No se ha podido reserver memoria para hacer el registro");
exit(1);
}
else{
newPerson->age=age;
newPerson->name=name;
newPerson->next=NULL;
savePerson(newPerson);
}
return newPerson;
}
Person * insertPerson(Person *p, int age, char *name){
Person *newPerson, *pAux;
newPerson=createPerson(age,name);
if(newPerson){
if(!p)
p=newPerson;
else{
pAux=p;
while(pAux->next)
pAux=pAux->next;
pAux->next=newPerson;
}
}
return p;
}
Person * registerPerson(Person *p){
int age;
char *name;
char aux[50];
system("cls");
printf("Ingrese el nombre de la persona\n");
fflush(stdin);
gets(aux);
name=(char*)malloc((sizeof(char)*strlen(aux))+1);
if(!name){
printf("no se pudo crear el nombre\n");
exit(1);
}
else{
strcpy(name,aux);
}
printf("Ingrese la edad de la persona\n");
scanf("%i", &age);
p=insertPerson(p,age, name);
}
void showPerson (){
FILE * file;
file=fopen(ARCHIVE_PERSONS,"rb");
Person *newPerson;
newPerson=(Person*)malloc(sizeof(Person));
if(!file){
printf("El archivo esta vacio\n");
pause();
}
if(!newPerson){
printf("No se puede leer archivo\n");
pause();
}else{
system("cls");
printf("%-10s %-10s\n","Nombre","Edad");
while(fread(newPerson,sizeof(Person),1,file))
printf("%-10s %-10i\n",newPerson->name,newPerson->age);
}
fclose(file);
}
void menu(){
int op;
Person *p;
p=NULL;
do{
system("cls");
printf("[1]Ingresar persona\n");
printf("[2]Mostrar personas\n");
printf("[3]Salir\n");
scanf("%i",&op);
switch(op){
case 1: p=registerPerson(p); break;
case 2: showPerson(); break;
case 3: exit(1); break;
default: printf("Opcion incorrecta\n");break;
}
pause();
}while(op!=3);
}
int main(){
menu();
pause();
}