Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Franquieli en 24 Julio 2012, 03:05 am



Título: Problema con bucle y funcion feof
Publicado por: Franquieli en 24 Julio 2012, 03:05 am
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.




Título: Re: Problema con bucle y funcion feof
Publicado por: rir3760 en 24 Julio 2012, 14:56 pm
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:
Código
  1. for (i = 0; fread(lectura, sizeof *lectura, 1, pf) == 1; i++)
  2.   printf(
  3.      "Nombre:%s\nnota1:%u\nnota2:%u",
  4.      lectura.nombre,
  5.      lectura.nota1,
  6.      lectura.nota2
  7.   );
  8. cant_alumnos = i;

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

Un saludo


Título: Re: Problema con bucle y funcion feof
Publicado por: Franquieli en 30 Julio 2012, 21:21 pm
Muchas gracias rir3760 me solucionaste un problema que me venia rompiendo bastante las bolas. jaja saludos  ;D