26/04/2012, 08:14
|
| | 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');
}
|