Bueno mi duda es la siguiente:
Hice un programa en Lenguaje C el cual consiste en que guarda una lista de alumnos con su matricula y sus respectivas 3 calificaciones y bueno se va guardando en un fichero, ahora bien, en una del menú que se imprime, se guardan en otro archivo solo los alumnos aprobados o reprobados. La opción final es imprimir los datos del otro archivo, y lo hace, excepto que no imprime el nombre del alumno y parece que el error está a la hora de copiar los datos.
Bueno aqui les dejo mi codigo, y les AGRADEZCO la ayuda
Código:
#include <stdio.h> #define mx 40 typedef struct { int mat, c[3]; char nom[]; } reg; reg altas[mx], apr[mx]; leef(char arch[], reg altas[], int *tamano) { int i = 0, p = 0; FILE *fp; if((fp = fopen(arch,"a+b")) == NULL) printf("Error en la lectura del archivo.\n"); else { fread(&altas[i], sizeof(reg), 1, fp); while(!feof(fp)) { fread(&altas[i++], sizeof(reg), 1, fp); p++; } fclose(fp); *tamano = p; } } creaf(char arch[], reg altas[], int tamano) { int i = 0; FILE *fp; if((fp = fopen(arch, "wb")) == NULL) printf("Error en la escritura del archivo.\n"); else { fwrite(&altas[i], sizeof(reg), 1, fp); for(i = 0; i < tamano; i++) fwrite(&altas[i], sizeof(reg), 1, fp); fclose(fp); } } char menu () { char r; printf("\nSeleccione una opcion...\n\n"); printf("A>lmacenar.\n"); printf("C>onsultar.\n"); printf("S>alir.\n"); r = tolower(getchar()); getchar(); return r; } char smenu () { char r; printf("\nSeleccione una opcion...\n\n"); printf("A>probados.\n"); printf("R>eprobados.\n"); printf("S>alir.\n"); r = tolower(getchar()); getchar(); return r; } float prom(int cal[]) { int i; float s = 0; for (i = 0; i < 3; i++) s += cal[i]; return s / 3; } main () { int i = 0, j, p = 0, a, f = 0; char r = 's', r1 = 's'; printf("Lista de alumnos.\n\n\n"); printf("Dame la matricula del alumno %d: ", i + 1); scanf("%d%*c", &altas[i].mat); while(altas[i].mat != 0) { printf("Dame el nombre: "); gets(altas[i].nom); for(j = 0; j < 3; j++){ printf("\nDame la calificacion %d: ", j + 1); scanf("%d%*c", &altas[i].c[j]); } p++; i++; printf("\n\nDame la matricula del alumno %d: ", i + 1); scanf("%d%*c", &altas[i].mat); } creaf("lista.dat", altas, p); do { switch (menu()) { case 'a': r1 = 's'; if(p == 0) printf("El archivo esta vacio.\n"); else { do { switch(smenu()) { case 'a': a = 0; for(i = 0; i < p; i++) if(prom(altas[i].c) >= 6){ apr[a].mat = altas[i].mat; strcpy(altas[i].nom, apr[a].nom); for(j=0;j<3;j++) apr[a].c[j]=altas[i].c[j]; a++; } creaf("otro.dat", apr, a - 1); printf("Alumnos aprobados almacenados.\n"); f = 1; break; case 'r': a = 0; for(i = 0; i < p; i++) if(prom(altas[i].c) < 6){ apr[a] = altas[i]; a++; } creaf("otro.dat", apr, a - 1); printf("Alumnos reprobados almacenados.\n"); f = 2; break; case 's': r1 = 'n'; break; default: printf("Opcion incorrecta.\n"); break; } } while(r1 == 's'); } break; case 'c': if(f == 0 || a == 0) printf("El archivo esta vacio.\n"); else { leef("otro.dat", apr, &a); if(f == 1) printf("Lista de alumnos aprobados:\n\n"); else printf("lista de alumnos reprobados:\n\n"); for(i = 0; i < a; i++) { printf("Matricula: %d\n", apr[i].mat); printf("Nombre: "); puts(apr[i].nom); printf("\nCalificaciones: 1.- %d 2.- %d 3.- %d\n\n", apr[i].c[0], apr[i].c[1], apr[i].c[2]); } } break; case 's': r = 'n'; break; default: printf("Opcion incorrecta.\n"); break; } } while(r == 's'); }