Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/04/2012, 08:14
jordy48
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 11 meses
Puntos: 1
Problema al imprimir datos de FICHERO

HOLA! Muy buenos dias tengan todos ustedes

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');		
}