Código:
docentes=fopen("docentes.txt","ab+");
cargar(d);
fclose(docentes);
cargar(d);
fclose(docentes);
Por otra parte y cómo se ha repetido muchas veces: es un error cargar una estructura directamente a un archivo y recuperarla de él totalmente.
C/C++ puede mover los miembros de las estructuras y dejar espacios vacíos entre ellos para que se ajusten en la memoria. En algunas plataformas esto se soluciona serializando estos datos. Pero una forma rápida de resolverlo es grabando en disco miembro a miembro y a la hora de sacarlas leyendo miembro a miembro en el mismo orden.
Si no lo haces de esta forma puede que creas que estas leyendo legajo cuando en realidad estás leyendo nombre_apellidos, por ejemplo.
Me he tomado la libertad de hacerle algunos arreglillos, sobre todo para el tema de que el tamaño teórico de una estructura no es el real y alguna que otra cosa con el manejo de los archivos. Aún así necesita aun muchas mejoras: validar fechas, recibir el tipo de dato esperado desde la consola y toda una larga lista de etcéteras. También lo he pasado a C (C++ no me gusta).
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define MAX_CADENA 50 typedef struct tfecha { int dia; int mes; int anyo; } fecha; typedef struct tformacion { char titulo[MAX_CADENA]; char facultad[MAX_CADENA]; char universidad[MAX_CADENA]; } formacion; typedef struct tdocente { int legajo; char nombre_apellido[MAX_CADENA]; fecha fecha_nac; formacion educacion; int DNI; char cargo[MAX_CADENA]; } docente; void grabar_registro(docente *registro, FILE *archivo); void leer_registro(docente *registro, FILE *archivo); void cargar(docente *individuo); void mostrar(docente *individuo); void cargar_docentes(char * const nombre_archivo); bool consulta(char * const nombre_archivo, int codigo); void mostrar_docentes(char * const nombre_archivo); void busqueda(char * const nombre_archivo, int codigo); void modificar_docente(char * const nombre_archivo, int codigo); void eliminar_docente(char * const nombre_archivo, int codigo); void listar_docentes_especificos(char * const nombre_archivo, char * const buscado); void nueva_cadena(char cadena[]); int main() { char *docentes = "docentes.txt"; int opcion, codigo; char buscado[MAX_CADENA]; do { switch(opcion) { case 1: cargar_docentes(docentes); break; case 2: if(consulta(docentes, codigo)) else break; case 3: mostrar_docentes(docentes); break; case 4: busqueda(docentes, codigo); break; case 5: modificar_docente(docentes, codigo); break; case 6: eliminar_docente(docentes, codigo); break; case 7: nueva_cadena(buscado); listar_docentes_especificos(docentes, buscado); break; case 8: break; default: } } while(opcion!=8); } void grabar_registro(docente *registro, FILE *archivo) { } void leer_registro(docente *registro, FILE *archivo) { } void cargar(docente *individuo) { nueva_cadena(individuo->nombre_apellido); nueva_cadena(individuo->educacion.titulo); nueva_cadena(individuo->educacion.facultad); nueva_cadena(individuo->educacion.universidad); nueva_cadena(individuo->cargo); } void mostrar(docente *individuo) { printf("Fecha de nacimiento: %d/%d/%d\n", individuo->fecha_nac.dia, individuo->fecha_nac.mes, individuo->fecha_nac.anyo); } void cargar_docentes(char * const nombre_archivo) { docente d; FILE *fp; cargar(&d); if(consulta(nombre_archivo, d.legajo)==false) { grabar_registro(&d, fp); } else } bool consulta(char * const nombre_archivo, int codigo) { docente d; char c; bool encontrado=false; if(fp) { leer_registro(&d, fp); if(d.legajo==codigo) encontrado=true; } } return encontrado; } void mostrar_docentes(char * const nombre_archivo) { docente d; char c; if(!fp) { return; } leer_registro(&d, fp); mostrar(&d); } } void busqueda(char * const nombre_archivo, int codigo) { docente d; char c; bool encontrado=false; if(!fp) { return; } leer_registro(&d, fp); if(d.legajo==codigo) { mostrar(&d); encontrado=true; } } if(encontrado==false) } void modificar_docente(char * const nombre_archivo, int codigo) { docente d; char c; long int posicion = 0; bool encontrado=false; if(!fp) { return; } leer_registro(&d, fp); if(codigo==d.legajo) encontrado=true; else } if(encontrado) { cargar(&d); grabar_registro(&d, fp); } else } void eliminar_docente(char * const nombre_archivo, int codigo) { const char *nombre_temporal = "temporal.txt"; docente d; char c; FILE *fp; FILE *temporal; if(!fp) { return; } if(!temporal) { return; } leer_registro(&d, fp); grabar_registro(&d, temporal); } else } void listar_docentes_especificos(char * const nombre_archivo, char * const buscado) { docente d; char c; if(!fp) { return; } leer_registro(&d, fp); mostrar(&d); } } void nueva_cadena(char cadena[]) { char *c; if(c) *c = '\0'; }