/* INSERTA un registro en un fichero secuencial, utilizando un fichero auxiliar para copiar la nueva disposición de los registros */ #include #include #include #include typedef struct { char nombre[30]; int edad; int curso; int nota; } TIPOALUMNO; void MostrarCabeceras (void) { gotoxy(1, 8); puts("---------------------------------------------"); puts(" DATOS ALUMNO "); puts("---------------------------------------------"); puts(" NOMBRE :"); puts(" EDAD :"); puts(" CURSO :"); puts(" NOTA :"); puts("---------------------------------------------"); } void LeerCampos (TIPOALUMNO *reg) { gotoxy(15, 11); gets(reg->nombre); gotoxy(15, 12); scanf("%d",®->edad); gotoxy(15, 13); scanf("%d",®->curso); gotoxy(15, 14); scanf("%d",®->nota); gotoxy(15, 17); } main () { FILE *fent,*fsal; TIPOALUMNO ralumno, rnuevo; char escrito; fent = fopen("ALUMNOS.DAT","rb"); if ( fent == NULL ) { perror("ALUMNOS.DAT"); return 1; } // Creo un fichero temporal fsal = fopen("ALUMNOS.TMP","wb"); if ( fsal == NULL ) { perror("ALUMNOS.TMP"); return 2; } clrscr(); // Borro la pantalla MostrarCabeceras(); LeerCampos(&rnuevo); fread(&ralumno,sizeof(TIPOALUMNO),1,fent ); escrito = 'n'; while ( !feof(fent) && escrito == 'n' ) { if ( strcmp(rnuevo.nombre, ralumno.nombre) < 0) { // Grabo el nuevo registro fwrite(&rnuevo,sizeof(TIPOALUMNO),1,fsal ); escrito = 's'; } fwrite(&ralumno,sizeof(TIPOALUMNO),1,fsal); fread (&ralumno,sizeof(TIPOALUMNO),1,fent ); } // SI hay que grabarlo al final if ( escrito == 'n') { fwrite(&rnuevo,sizeof(TIPOALUMNO),1,fsal ); } else { // Escribo el resto del fichero while ( !feof(fent) ) { fwrite(&ralumno,sizeof(TIPOALUMNO),1,fsal); fread (&ralumno,sizeof(TIPOALUMNO),1,fent ); } } // Cierro los ficheros fclose(fent); fclose(fsal); // Borro el fichero original remove("ALUMNOS.DAT"); // Cambio de nombre el fichero auxiliar rename("ALUMNOS.TMP","ALUMNOS.DAT"); puts("Registro insertado."); getch(); return 0; }