gracias de antemano
saludos cordiales
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <iostream> #define MAXSTR 0xFF using namespace std; typedef struct ClaseAlumno{ int matricula; char* nombre; }Alumno; int comparar_alumno (const void *alumno1, const void *alumno2); void imprimir_alumno (Alumno *alumno); Alumno* agregar_alumno (Alumno *alumnos, Alumno *alumno, int *n); char* leer_linea (const char *mensaje); char* leer_cadena (const char *mensaje, char *cadena); int leer_entero (const char *mensaje, int menor, int mayor); float leer_real (const char *mensaje); char leer_caracter (const char *mensaje); int leer_campo (FILE *archivo, char *cadena); int main(){ Alumno alumno, *alumnos = NULL, *p; int opcion, n=0, i; char cadena[MAXSTR], *ruta = "D:\\alumnos.txt"; FILE *archivo; archivo = fopen(ruta, "r"); if (archivo!=NULL) { while (leer_campo(archivo, cadena)) { alumno.matricula = atoi(cadena); leer_campo(archivo, cadena); alumno.nombre = strdup (cadena); alumnos = agregar_alumno(alumnos, &alumno, &n); } fclose(archivo); } do{ system ("cls"); cout<<endl <<"MENU DEL SISTEMA DE MATRICULA DE ALUMNOS"<<endl <<"1.- Agregar nuevo alumno"<<endl <<"2.- Consultar un alumno"<<endl <<"3.- Modificar un alumno"<<endl <<"4.- Eliminar un alumno"<<endl <<"5.- Reporte de todos los alumnos"<<endl <<"6.- Salir del sistema"<<endl <<endl; opcion = leer_entero("Seleccione una opcion: ", 1, 6); if(opcion<5) { alumno.matricula=leer_entero("Ingrese el matricula del alumno: ", 0, INT_MAX); p = n==0? NULL:(Alumno*) bsearch(&alumno, alumnos, n, sizeof(Alumno), comparar_alumno); if(p!=NULL) imprimir_alumno (p); } if(p!=NULL && opcion==1) cout<<"El alumno ya existe"<<endl; else if (p==NULL && opcion>=2 && opcion<=4) cout<<"Alumno no encontrado"<<endl; else switch(opcion) { case 1: alumno.nombre = leer_linea("Ingrese el nombre: "); alumnos = agregar_alumno (alumnos, &alumno, &n); cout<<"Registro agregado correctamente"<<endl; break; case 3: free(p->nombre); p->nombre = leer_linea("Ingrese el nombre: "); cout<<"Alumno actualizado correctamente"<<endl; break; case 4: free(p->nombre); if (p!=&alumnos[n-1]) memcpy (p, &alumnos[n-1], sizeof(Alumno)); n--; alumnos=(Alumno*) realloc(alumnos, sizeof(Alumno) * n); qsort(alumnos, n, sizeof(Alumno), comparar_alumno); cout<<"Alumno borrado correctamente"<<endl; break; case 5: for (i=0; i<n; i++) imprimir_alumno (&alumnos[i]); break; } if(opcion<6 && opcion>=1) { system("pause"); } } while(opcion!=6); archivo=fopen(ruta, "w"); if(archivo!=NULL) { for (i=0; i<n; i++) fprintf (archivo, "%d,%s\n", alumnos[i].matricula, alumnos[i].nombre); fclose(archivo); } return EXIT_SUCCESS; } int comparar_alumno(const void *alumno1, const void *alumno2) { return((Alumno*)alumno1)->matricula-((Alumno*)alumno2)->matricula; } void imprimir_alumno(Alumno *alumno) { printf("matricula: %d\n", alumno->matricula); printf("nombre : %s\n", alumno->nombre); } Alumno* agregar_alumno(Alumno *alumnos, Alumno *alumno, int *n) { *n = *n + 1; alumnos=(Alumno*)realloc(alumnos, sizeof(Alumno)*(*n)); memcpy(&alumnos[(*n)-1], alumno, sizeof(Alumno)); qsort(alumnos, *n, sizeof(Alumno), comparar_alumno); return alumnos; } char *leer_linea(const char *mensaje) { char linea[MAXSTR]; leer_cadena(mensaje, linea); return strdup(linea); } char* leer_cadena(const char *mensaje, char *cadena) { char *salto; cout<<mensaje; fgets(cadena, MAXSTR, stdin); salto=strchr(cadena, '\n'); if(salto!=NULL) *salto = '\0'; return cadena; } int leer_entero(const char *mensaje, int menor, int mayor) { int valor; do { valor =(int)leer_real (mensaje); if (valor<menor || valor>mayor) cout<<"Numero no valido"<<endl; } while(valor<menor || valor>mayor); return valor; } float leer_real(const char *mensaje) { char cadena[MAXSTR]; leer_cadena(mensaje, cadena); return atof(cadena); } char leer_caracter(const char *mensaje) { char linea[MAXSTR]; leer_cadena(mensaje, linea); return linea[0]; } int leer_campo(FILE *archivo, char *cadena) { fscanf(archivo, "%[^,\n\r]", cadena); if(feof(archivo)) return 0; fgetc(archivo); return 1; }