Problema con bucle y funcion feof

Iniciado por Franquieli, 24 Julio 2012, 03:05 AM

0 Miembros y 1 Visitante están viendo este tema.

Franquieli

Hola, estoy haciendo un programa de prueba en el cual creo un archivo binario, despues lo leo y hago unos calculos.El programa es el siguiente:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    struct datos{
        char nombre[30];
        unsigned int nota1;
        unsigned int nota2;
    };
    struct datos alumnos[50];
    int n;
    printf("Ingrese la cantidad de alumnos del curso:\n");
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
        printf("\nIngrese el apellido del alumno %d:\n",i);
        scanf("%s",alumnos.nombre);
        fflush(stdin);
        printf("\nIngrese la nota del modulo 1 del alumno %d:\n",i);
        scanf("%u",&alumnos.nota1);
        fflush(stdin);
        printf("\nIngrese la nota del modulo 2 del alumno %d:\n",i);
        scanf("%u",&alumnos.nota2);
        fflush(stdin);
    }
    FILE *pf;
    pf=fopen("alumnos.dat","wb");
    if(pf==NULL)
    {
        printf("Error al abrir el archivo");
        exit(1);
    }
    fwrite(alumnos,sizeof(struct datos),n,pf);
    if(fclose(pf)!=0)
    {
        printf("Error al cerrar el archivo");
        exit(1);
    }
    pf=fopen("alumnos.dat","rb");
    if(pf==NULL)
    {
        printf("Error al abrir el archivo para lectura");
        exit(1);
    }
    fseek(pf,0l,SEEK_SET);
    struct copia{
        char nombre[30];
        unsigned int nota1;
        unsigned int nota2;
    };
    struct copia lectura[50];
    int cant_alumnos=0;
    i=0;
    while(!feof(pf))
    {
        fread(&lectura,sizeof(struct copia),1,pf);
        printf("\n\nNombre del alumno:%s\nnota1:%u\nnota2:%u",lectura.nombre,lectura.nota1,lectura.nota2);
        cant_alumnos++;
        i++;
    }
    float promedio;
    float promedio_max=0;
    char nombre_max[30];
    int j;
    for(i=0;i<cant_alumnos;i++)
    {
        promedio=((lectura.nota1)+(lectura.nota2))/2;
        if(promedio>promedio_max)
        {
            for(j=0;j<30;j++)
            {
                nombre_max[j]='\0';
            }
            promedio_max=promedio;
            strcpy(nombre_max,lectura.nombre);
        }
    }
    if(fclose(pf)!=0)
    {
        printf("Error al cerrar el archivo para lectura");
        exit(1);
    }


    printf("\n\nEl alumno del mejor promedio es %s y el promedio es %.2f",nombre_max,promedio_max);
    return 0;
}

Mi problema es que cuando entra en el bucle del while(!feof(pf)) hace una pasada de mas y lee un dato que no tendria que hacerlo. Porfavor, espero una pronta solucion. saludos.



rir3760

El problema con la lectura incorrecta de los registros se debe a dos errores:

* El primero sucede al tratar de leer un registro ya que siempre lo almacenas en "lectura", esa es la primera posición del array. Debes indicar la posición del elemento con "&lectura[ i ]" o "lectura + i"

* El segundo es lógico ya que el correcto funcionamiento de "feof" es devolver verdadero (diferente de cero) solo después que una función de lectura como "fread" falle.

Ese fragmento (y solo ese) corregido:
for (i = 0; fread(lectura, sizeof *lectura, 1, pf) == 1; i++)
   printf(
      "Nombre:%s\nnota1:%u\nnota2:%u",
      lectura.nombre,
      lectura.nota1,
      lectura.nota2
   );
cant_alumnos = i;


Debo aclarar que no verifique a fondo el programa, tal vez (eso parece) tenga mas errores.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Franquieli

Muchas gracias rir3760 me solucionaste un problema que me venia rompiendo bastante las bolas. jaja saludos  ;D