Hola creo te estas complicando demasiado las cosas te envio codigo de una agenda q emplea el mismo concepto que estas buscando, checa las funciones de separa y de carga_registro, para que después las apliques a tu programa
Espero te funcione
#include<ctype.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
struct directorio
{
int id_agenda;
char nombre[100];
char direccion[200];
char telefono[20];
char e_mail[100];
};
int folio=0;
FILE *arch_salida, *archivo;
void salir(struct directorio *agenda)
{
char registro[450],id[4];
struct directorio paso;
char path[250];
sprintf(path,"c:\\registros.txt");
if((arch_salida=fopen(path,"w"))==NULL)
printf("\tError al abrir el archivo");
else
{
for(int i=0;i<folio;i++)
{
strcpy(registro,"\0");
strcpy(id,"\0");
sprintf(id,"%d",i+1);
strcat(id,"|");
strcpy(paso.nombre,(agenda+i)->nombre);
strcpy(paso.direccion,(agenda+i)->direccion);
strcpy(paso.telefono,(agenda+i)->telefono);
strcpy(paso.e_mail,(agenda+i)->e_mail);
strcat(paso.nombre,"|");
strcat(paso.direccion,"|");
strcat(paso.telefono,"|");
strcat(paso.e_mail,"\n");
strcat(registro,id);
strcat(registro,paso.nombre);
strcat(registro,paso.direccion);
strcat(registro,paso.telefono);
strcat(registro,paso.e_mail);
fputs(registro,arch_salida);
}
fclose(arch_salida);
}
printf("\n\n\t***** Datos Actualizados ***** \n");
}
int ordena(const void *a, const void *
{
struct directorio *ap_a;
struct directorio *ap_b;
ap_a=(struct directorio*)a;
ap_b=(struct directorio*)b;
return (strcmp(ap_a->nombre, ap_b->nombre));
}
int cuenta_registros(void)
{
int cont_reg=0;
char registro[450];
if((archivo=fopen("c:\\registros.txt","r"))==NULL)
{
printf("\nError: Archivo no leido\n");
}
else
{
while((fgets(registro,450,archivo))!=NULL)
{
cont_reg++;
}
fclose(archivo);
}
return (cont_reg);
}
struct directorio separa(char *registro)
{
char campo[100], letra[2];
int longitud=0, pos, cont=0, id_a=0;
struct directorio alumno;
longitud= strlen(registro);
campo[0]='\0';
for(pos=0; pos<longitud; pos++)
{
strcpy(letra,"\0");
strncpy(letra,registro+pos,1);
if(letra[0]!='|' && letra[0]!='\n')
{
letra[1]='\0';
strcat(campo,letra);
}
else
{
cont++;
if(cont==1)
id_a=atoi(campo);
alumno.id_agenda=id_a;
if(cont==2)
strcpy(alumno.nombre,campo);
if(cont==3)
strcpy(alumno.direccion,campo);
if(cont==4)
strcpy(alumno.telefono,campo);
if(cont==5)
strcpy(alumno.e_mail,campo);
strcpy(campo,"\0");
}
}
return(alumno);
}
void cargar(struct directorio *arreglo)
{
int reg=0;
char registro[450];
if((archivo=fopen("c:\\registros.txt","r"))==NULL)
printf("\nError: Archivo no leido\n");
else
{
printf("\t***** Archivo cargado con exito!!! *****");
getch();
while((fgets(registro,450,archivo))!=NULL)
{
*(arreglo+reg)=separa(registro);
reg++;
}
fclose(archivo);
}
}
void altas(struct directorio *agenda)
{
struct directorio datos, *pos_bus;
fflush(stdin);
printf("\n\tIntroduce el nombre: ");
gets(datos.nombre);
fflush(stdin);
qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
pos_bus=(struct directorio *)bsearch((void *)&datos,(void *)agenda,folio,sizeof(struct directorio),ordena);
if(pos_bus!=NULL)
{
printf("\n\tRegistro encontrado, ya existe, presiona una tecla para continuar...");
getch();
strcpy(datos.nombre,"\0");
return;
}
else
{
if(folio<50)
{
printf("\tDireccion: ");
gets(datos.direccion);
printf("\tTelefono: ");
gets(datos.telefono);
printf("\tE mail: ");
gets(datos.e_mail);
datos.id_agenda=folio+1;
*(agenda+folio)=datos;
folio++;
}
else
{
printf("\tNo hay espacio para otro registro");
getch();
}
}
}
void bajas(struct directorio *agenda)
{
struct directorio busca,*pos_bus;
char opc;
printf("Inserta el nombre del registro a eliminar: ");
fflush(stdin);
gets(busca.nombre);
qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
pos_bus=(struct directorio *)bsearch((void *)&busca,(void *)agenda,folio,sizeof(struct directorio),ordena);
if(pos_bus==NULL)
{
printf("No existe algun registro con ese nombre...");
getch();
strcpy(busca.nombre,"\0");
return;
}
else
{
printf("Id agenda: %d\n",pos_bus->id_agenda);
printf("Nombre: %s\n",pos_bus->nombre);
printf("Direccion: %s\n",pos_bus->direccion);
printf("Telefono: %s\n",pos_bus->telefono);
printf("E mail: %s\n",pos_bus->e_mail);
}
printf("Desea eliminar este registro S o N?\n");
scanf("%c",&opc);
if(toupper(opc=='s'))
{
pos_bus->id_agenda=NULL;
*(pos_bus->nombre)=NULL;
*(pos_bus->direccion)=NULL;
*(pos_bus->telefono)=NULL;
*(pos_bus->e_mail)=NULL;
*(pos_bus)=*(agenda+(folio-1));
(agenda+(folio-1))->id_agenda=NULL;
*(agenda+(folio-1))->nombre=NULL;
*(agenda+(folio-1))->direccion=NULL;
*(agenda+(folio-1))->telefono=NULL;
*(agenda+(folio-1))->e_mail=NULL;
folio--;
printf("\n\tRegistro borrado satisfactoriamente, presiona una tecla para continuar");
getch();
}
}
void consulta(struct directorio *agenda)
{
struct directorio busca, *pos_bus;
printf("\tIntroduce el nombre a consultar :");
fflush(stdin);
gets(busca.nombre);
qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
pos_bus=(struct directorio *)bsearch((void *)&busca,(void *)agenda,folio,sizeof(struct directorio),ordena);
if(pos_bus==NULL)
{
printf("Nombre no encontrado...");
getch();
strcpy(busca.nombre,"\0");
}
else
{
printf("Id agenda: %d\n",pos_bus->id_agenda);
printf("Nombre: %s\n",pos_bus->nombre);
printf("Direccion: %s\n",pos_bus->direccion);
printf("Telefono: %s\n",pos_bus->telefono);
printf("E mail: %s\n",pos_bus->e_mail);
}
}
void visualiza(struct directorio *agenda)
{
int i=0;
for(i=0;i<folio;i++)
{
printf("\n\tId agenda: %d\n",(agenda+i)->id_agenda);
printf("\tNombre: %s\n",(agenda+i)->nombre);
printf("\tDireccion: %s\n",(agenda+i)->direccion);
printf("\tTelefono: %s\n",(agenda+i)->telefono);
printf("\tE mail: %s\n",(agenda+i)->e_mail);
}
getch();
}
void menu()
{
struct directorio *agenda;
int opcion;
agenda=(struct directorio *)malloc(50*sizeof(struct directorio));
folio=cuenta_registros();
cargar(agenda);
while(opcion!=5)
{
system("cls");
printf("\t\t***** MENU *****\n\n");
printf("\t1.- Ingresar registro");
printf("\n\t2.- Borrar registro");
printf("\n\t3.- Consultar registro");
printf("\n\t4.- Visualizar Agenda");
printf("\n\t5.- Salir\n");
printf("\n\n\tSeleccione una opcion: ");
scanf("%i",&opcion);
switch(opcion){
case 1: altas(agenda);break;
case 2: bajas(agenda);break;
case 3: consulta(agenda);break;
case 4: visualiza(agenda);break;
case 5: salir(agenda);free(agenda); exit(0); break;
default: printf("\n\tOpcion no valida...");
printf("\n\t<Presione una tecla para continuar>");getch();break;
}
}
}
void main()
{
menu();
}